C# чтение файла построчно. Bash: Построчное Чтение Файла — While Read Line Цикл

Работа с файлами. Побайтовое чтение/запись. Чтение текстовых данных

Любой ввод и вывод информации в.Net Framework включает в себя использование потоков.

Поток — абстрактное представление последовательного устройств, облегчающее последовательное хранение данных и доступ к ним (по одному байту в каждый конкретный момент времени). В качестве такого устройства могут выступать расположенный на диске файл, принтер, область памяти, любой другой объект допускающий последовательное считывание и запись информации).

Это верно, потому что оператор использует файл для записи в файл. Например, вы можете написать программу, которая загружает имя и возраст пользователя и сохраняет эту информацию в текстовом файле. У нас еще есть еще один вопрос, который нужно прояснить. Что происходит, когда файл с указанным именем уже существует? Он будет очищен и сохранен снова, что не всегда то, что мы хотели бы. Представьте, например, файл для хранения списка действий, выполняемых пользователем. Мы не хотим каждый раз удалять его содержимое, просто добавляем новые строки данных в конец.

В пространстве имен System.IO хранятся классы, предназначенные для считывания и записи данных в файлы. Классы:

File – содержит статические методы для манипуляции файлами (создание, копирование, удаление); Directory – содержит статические методы для манипуляции директориями;

Path – статических класс, «путь»; FileInfo – не обладает статическими методами, соответствует физическому фалу, во многом дублирует функциональность File;

Чтобы сохранить информацию в конце файла, выражайте это намерение при его открытии. Для этой цели в оператор потока добавляется специальный параметр. Теперь новые данные не будут удалять старые, только будут добавлены в конце файла. Вы уже знаете, как записывать данные в файл, поэтому пришло время учиться их читать. Это делается очень похоже на предыдущий.

Чтение файла строки вдоль строки

Вот общая структура кода для чтения содержимого файла. Как вы можете видеть, ничего нового здесь нет. Файл можно прочитать тремя способами. Ниже приведено подробное описание каждого из этих методов. Этот метод включает чтение одной строки текста и запись ее в виде строки.

FileInfo aFile = new FileInfo("d:\log.txt"); if (aFile.Exists == false) { aFile.Create(); } aFile.Attributes = FileAttributes.ReadOnly | FileAttributes.Hidden; // aFile.Attributes = aFile.Attributes &~FileAttributes.ReadOnly; // убрать атрибут

FileStream – представляет поток, указывающий на файл или местоположение в сети. Представляет файл для считывания/записи, оперирует байтами и массивом байтов, в то время как Stream оперирует символьными данными.

Читая слово слово за словом

Этот метод также легко изучить. В этом случае считывается все, что находится между местом в файле, в котором мы находимся, и ближайшим пространством.

Чтение файла символа после символа

Этот метод предназначен для чтения из файла одного символа, и как только один из всех описан нам совершенно новый. Но, конечно, как и предыдущий, легко справиться с этим.

Этот метод считывает все типы символов, включая пробелы, символы новой строки, вкладки и т.д. Часто необходимо прочитать все содержимое файла. Эта функция не только считывает строки содержимого файла, но дополнительно возвращает логическое значение, указывающее, следует ли продолжать чтение. В любом случае операция чтения должна быть завершена. Мы будем использовать один из них, чтобы прочитать содержимое файла до самого конца.

FileStream fs = new FileStream("d:\log.txt", FileMode.OpenOrCreate, FileAccess.Read); >> enum FileMode { Append, // открывает (если существует), переводит указатель в конец, или создает новый файл. Может использоваться только совместно с FileAccess.Write Create, // создает (если существует – заменяет) CreateNew, // создает (если существует – генерируется исключение) Open, // открывает (если не существует – генерируется исключение) OpenOrCreate, // если существует открывает, иначе создает новый Truncate // открывает существ. файл,но всю ифн. внутри затирает (если не существует – исключение) } >> enum FileAccess { Rad, Write, ReadWrite } FileStream fs = File.OpenRead("d:\log.txt"); // открывает "только на чтение" FileStream fs = File.OpenWrite("d:\log.txt"); // открывает для записи

Когда мы загружаем текстовую строку, мы можем делать это с тем, что нам нравится. Эта программа только поочередно отображает каждую строку контента, но в реальной программе они будут использоваться по-другому. Единственное ограничение - ваше воображение.

Вышеупомянутый метод чтения содержимого файлов чаще всего используется всеми. Когда вы загружаете текстовые строки в строку, вы можете работать с ней, используя строковые функции. Вам просто нужно знать еще несколько трюков, и вы уже знаете все, что вам нужно знать о методах работы с файлами.

Класс FileStream поддерживает внутренний указатель файла, ссылающийся на то место в файле, в котором будет производиться очередная операция чтения/записи. Метод Seek() позволяет осуществить поиск конкретной позиции в файле (байтовой).

Public long Seek(long offset, SeekOrigin origin); // origin = { Begin, End, Current } // offset – на сколько вперед в байтах должен быть передвинут указатель // origin – с какой точки веси отсчет fs.Seek(-5, SeekOrigin.End); // переходит на 5й с конца байт файла

Открытые файлы автоматически закрываются, когда программа завершает выполнение блока, в котором были созданы их потоки. Вам не нужно ничего делать, чтобы закрыть файл. И к счастью, потому что мы никогда его не забудем. Иногда, однако, вы должны закрыть файл раньше, чем это должно произойти автоматически.

Вы также можете объявить поток, но откройте файл, чтобы отложить его на потом. Обычно просто откройте файл напрямую и оставьте его автоматически закрывать. Это упрощает просмотр файла, в котором он открыт, и в котором он закрывается, но это действительно вопрос вкуса.

При чтении и записи в файл, происходит изменение позиции указателя (при считывании на 1б)

// побайтовое чтение из файла с отступом в 55 байт byte byData = new byte; // массив байтов char charData = new char; // масив символов try { // файловый поток, открывает файл (при отсутсвии создает) только для чтения FileStream fs = new FileStream("d:\log.txt", FileMode.OpenOrCreate, FileAccess.Read); if (fs.CanSeek == true) // если можно производить поиск { fs.Seek(55, SeekOrigin.Begin); // делаем отступ на 55 байт с начала файла // чтение данных и запись в масив байтов, со двигом в мас. 0, и длинной в 100 байт fs.Read(byData, 0, 100); } fs.Dispose(); // освобождаем ресурсы } catch (IOException err) { MessageBox.Show(err.Message); return; } Decoder d = Encoding.UTF8.GetDecoder(); // декодирует в кодировку UTF8 (Unicode) d.GetChars(byData, 0, byData.Length, charData, 0); // преобразовывет байты в символы string str = new string(charData); // строим строку MessageBox.Show(str); } // записываем в файл побайтно начиная с позиции 55 набор байтов char charArr = "sauron918".ToCharArray(); byte byteArr = new byte; try { FileStream fs = new FileStream("d:\log.txt", FileMode.OpenOrCreate, FileAccess.Write); fs.Seek(55, SeekOrigin.Begin); Encoder enc = Encoding.UTF8.GetEncoder(); enc.GetBytes(charArr, 0, charArr.Length, byteArr, 0, true); // перекодирование fs.Write(byteArr, 0, byteArr.Length); // запись массива байт fs.Dispose(); // освобождаем ресурсы } catch (Exception err) { MessageBox.Show(err.Message); return; }

На мгновение мы углубимся в технические детали, чтобы точно знать, как читать содержимое файла. Когда мы открываем файл в текстовом редакторе, таком как «Блокнот», мы найдем курсор в текстовом редакторе, указывающий, где мы находимся. Когда вы нажимаете клавишу на клавиатуре, в точке, где находится курсор, появляется новая буква.

Это означает, что таким образом содержимое файла можно просматривать только последовательно. К счастью, есть способы изменить положение курсора в файле. Например, вы можете переместить его до 20 мест с начала файла или 32 символа вперед в текущую позицию. Это позволяет вам точно прочитать те части интересующего нас файла.

Классы Stream позволяют осуществлять последовательный доступ к файлам, и в них не предусмотрена возможность работы с указателем.

StreamWriter – позволяет осуществлять запись в файл символов и строк и самостоятельно выполняет все необходимые преобразования.

StreamWriter sw = new StreamWriter(fs); StreamWriter sw = new StreamWriter("d:\log.txt", true); // true - добавлять инф. или создать новый -- FileStream fs = new FileStream("d:\log.txt", FileMode.OpenOrCreate, FileAccess.Write); StreamWriter sw = new StreamWriter(fs); sw.WriteLine("hello world"); sw.Write("this is "); sw.Close();

Проверка положения курсора в файле

Однако для этого сначала вам нужно выяснить, где находится файл. Только тогда мы можем переместить курсор. Ниже вы узнаете, как это сделать. Существуют специальные функции для проверки того, какой байт в файле указывает на курсор. Другими словами, эти функции позволяют вам видеть, какой символ является курсором в данный момент. К счастью, они используются одинаково. Эти функции также используются таким же образом, поэтому приведен пример использования только одного из них.

Параметр позиции может принимать одно из трех значений. Чтобы проверить длину файла, используйте знания, полученные в двух предыдущих разделах, т.е. сначала вам нужно переместить курсор в конец файла, а затем «спросить» поток, в котором находится курсор.

StreamReader – осуществляет чтение символьных данных из потока и их преобразование.

StreamReader sr = new StreamReader("d:\log.txt", Encoding.UTF8); while (sr.Peek() != -1) { Line = sr.ReadLine(); // Line = sr.ReadToEnd(); MessageBox.Show(Line); } sr.Dispose(); // sr.Close(); -- string path = @"c:tempMyTest.txt"; try { if (File.Exists(path)) { File.Delete(path); } using (StreamWriter sw = new StreamWriter(path)) { sw.WriteLine("is some text"); } using (StreamReader sr = new StreamReader(path)) { while (sr.Peek() != -1) // проверяет следующий символ, но не считывает { Console.WriteLine(sr.ReadLine()); } } } catch (Exception e) { Console.WriteLine("The process failed: {0}", e.ToString()); } -- // чтение файлов с разделителями string Line; string strArr; char charArr = new char { " " }; try { FileStream fs = new FileStream("d:\log.txt", FileMode.Open); StreamReader sr = new StreamReader(fs, Encoding.UTF8); while (sr.EndOfStream != true) // framework 2.0 { Line = sr.ReadLine(); strArr = Line.Split(charArr); for (int i = 0; i < strArr.Length; i++) { MessageBox.Show(strArr[i].Trim()); } } sr.Close(); } catch(Exception ex) { MessageBox.Show(ex.Message); }

Это все для основных новостей. Вы можете начать изучать секреты мира файлов и языков программирования. После того как вы освоите материал в этой главе, вы будете готовы ознакомиться с более продвинутыми темами и реализовать серьезные проекты. Это хорошо, потому что в следующей главе вам нужно будет сделать практический проект, который потребует всего, что вы узнали до сих пор.

Прежде чем перейти к этому проекту, просмотрите все проблемы, которые до сих пор были для вас наиболее проблематичными. Файлы можно читать в двоичном или текстовом режиме. Вы можете загружать строки и блоки с указателем, установленным в файле. Полезно только читать файл в текстовом режиме, предпочтительно в одиночных линиях. Программа открывает файл, который мы предоставили, и проверяет наличие ошибок. Функция вызывается в цикле, пока файл не достигнет конца. Поскольку мы загружаем только текст из файла, мы можем использовать библиотеку.

FileStreamWatcher – используется для слежения за состоянием файловой системы (файлов и директорий) и генерирует события в моменты, когда изменяется их местоположение. Сначала нужно задать значения свойств, определив, где следует осуществлять контроль, что нужно контролировать и когда следует генерировать события. Свойства:

Path – путь к файлу/директории, подлежащей контрою.

Имена происходят от английского. В цикле мы получаем одиночные строки, где мы можем выполнять различные операции. Если бы это были числа, вы могли бы преобразовать их в двоичный или десятичный, со словами палиндромы и анаграммы сразу. Это будет здорово, если вы оставите комментарий к этой статье! Если вы не хотите писать комментарий, попробуйте!

И каково было бы загружать данные, разделенные специальным символом? Если у вас есть строка символов, разделенных пробелами в задании средней школы. Будьте осторожны с использованием потока. Все могут разбросать, если одна строка будет иметь, например, 4 слова, а другая функция встроена, чтобы отделить текст после того, как некоторые символы, к сожалению, этого не сделали.

NotifyFilter – сочетание значений перечисляемого типа NotifyFilters, которое позволяет определить за наступлением каких именно событий для данных файлов следует наблюдать. { Attributes, CreationTime, DirectoryName, FileName, LastAccess, LastWrite, Security, Size }. Допускается использование различных сочетаний этих значений посредством оператора | или &.

Filter – фильтр, определяющий какие именно файлы подлежат контролю, например, *.txt

Любые инструкции для экзаменаторов? Он даже не говорит, что ему нужно искать какие-либо инструкции. Запуск программы обнаружит, что он не работает, вы увидите некоторые пакетные файлы. По доброй воле он захочет потратить 20 минут на чтение ваших инструкций или дать вам 0 очков. Учтите, что экзаменатор проверяет задачи механически, редко погружается в код.

Допустим, у нас есть 120 номеров в одной строке, и мы должны писать те числа, которые имеют ту же длину, что и код. Написание чисел с одинаковой длиной в одной строке? Команда, которую вы дали, звучит странно. Мы всегда используем массивы при работе со многими типами данных того же типа.

EnableRaisingEvents – после задания всех свойст необходимо присвоить значение true, что будет означать начало наблюдения .

… this.watcher = new System.IO.FileSystemWatcher(); // объект наблюдение за файловой системой private System.IO.FileSystemWatcher watcher; … public Form1() { InitializeComponent(); DirectoryInfo di = new DirectoryInfo("D:\Source"); // директория для мониторинга if (di.Exists == false) di.Create(); watcher.Deleted += new FileSystemEventHandler(watcher_Deleted); watcher.Renamed += new RenamedEventHandler(watcher_Renamed); watcher.Changed += new FileSystemEventHandler(watcher_Changed); watcher.Created += new FileSystemEventHandler(watcher_Created); } void watcher_Created(object sender, FileSystemEventArgs e) { try { StreamWriter sw = new StreamWriter("d:\log.txt", true); sw.WriteLine("Файл {0} создан", e.FullPath); sw.Close(); lbWatch.Text = "Файл создан"; } catch (IOException) { lbWatch.Text = "Ошибка записи в лог"; } } void watcher_Changed(object sender, FileSystemEventArgs e) { try { // открыть ф. для дополнения (true), елси нет - создать StreamWriter sw = new StreamWriter("d:\log.txt", true); sw.WriteLine("Файл: {0} {1}", e.FullPath, e.ChangeType.ToString()); sw.Close(); lbWatch.Text = "Записыю измения в лог"; } catch (IOException) {lbWatch.Text = "Ошибка записи в лог";} } void watcher_Renamed(object sender, RenamedEventArgs e) { try { StreamWriter sw = new StreamWriter("d:\log.txt", true); sw.WriteLine("Файл переименован из {0} в {1}", e.OldName, e.FullPath); sw.Close(); lbWatch.Text = "Файл переименован"; } catch (IOException) {lbWatch.Text = "Ошибка записи в лог";} } void watcher_Deleted(object sender, FileSystemEventArgs e) { try { StreamWriter sw = new StreamWriter("d:\log.txt", true); sw.WriteLine("Файл {0} был удален", e.FullPath); sw.Close(); lbWatch.Text = "Файл удалён"; } catch (IOException) { lbWatch.Text = "Ошибка записи в лог"; } } private void btnWatch_Click(object sender, EventArgs e) { watcher.Path = Path.GetDirectoryName(txtLocation.Text); watcher.Filter = Path.GetFileName(txtLocation.Text); // "*.* // уведомлять об изм. времени последней записи, имени файла, размера файла watcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.Size; lbWatch.Text = "Наблюдаю: " + txtLocation.Text; watcher.EnableRaisingEvents = true; // начало наблюдения } private void btnBrowse_Click(object sender, EventArgs e) { if (FileDialog.ShowDialog() != DialogResult.Cancel) { txtLocation.Text = FileDialog.FileName; btnWatch.Enabled = true; } } ... string str; try { using (StreamReader sr = new StreamReader("d:\log.txt")) { while((str = sr.ReadLine()) != null) { MessageBox.Show(str); } } } catch (IOException err) { MessageBox.Show(err.Message); }

Список шагов используется для представления работы алгоритма, а не сложной программы. Весь материал, необходимый для выполнения задачи, находится в этом блоге. Вы загружаете цикл из 200 строк в две таблицы строк. Весь этот цикл показан в примере на этой странице выше. После загрузки метод работы остается очевидным. Вы выпускаете несколько циклов с помощью счетчика 0, 99, и вы работаете с отдельными массивами. Вы проверяете, равны ли они, являются ли они палиндромами или являются ли они анаграммами.

Не пытайтесь делать все в одном цикле, разбивая задачу как можно больше функций. Конечно, вы загружаете данные в две разные таблицы, потому что в каждой строке есть два слова. Готов поспорить, что такая прокрутка 99% индикаторов не будет работать. Или вы полностью не знаете, как работают массивы, или вы полностью перекомпилировали задачу и пытаетесь арифметически прокручивать указатель на 1 элемент массива?

Асинхронный доступ к файлам

Приложение может выполнять какие-то действия параллельно с процессом ввода/вывода файла, вместо ожидания окончания этого процесса. Процесс считываня файла начинается с вызова метода BeginRead(), методу передаются параметры аналогичные методу Read() + дополнительные, необходимые для осуществления асинхронного процесса.

Вы использовали красивую функцию разделения строк для создания пробелов с помощью оператора потока, но почему вы пишете все слова в первом элементе массива? Код будет короче, проще и эффективнее на 100%. То есть где будет столбец и как его назвать. Ниже приведен простой пример того, как определить, где расписание должно быть расположено, и какие данные мы будем использовать.

В первой строке мы укажем, что это будет обычный текст. Ниже мы собираем все данные из Банка Литвы и устанавливаем их в указанную переменную. Кроме того, прежде чем принимать данные по указанной ссылке, мы постоянно меняем дату в соответствии с датой. В этом случае нам не нужно будет обновлять файл и изменять дату.

Byte byteData = new byte; char charData = new char; try { FileStream fs = new FileStream("d:\log.txt", FileMode.Open); fs.Seek(0, SeekOrigin.Begin); // на начало файла // начало процедуры асинхронного чтения из файла, первые 3 параметра аналогичные Read() // 4й пар.-делегат на метод, к.будет вызван по завершению чтения // 5й пар.-заданный пользов. объект состояния, предназначенный для передачи некой // строки или данных, позволяющих идентифицир. данную асинхронную операцию IAsyncResult asResult = fs.BeginRead(byteData, 0, byteData.Length, null, null); // выполнение друхиг действий паралельно с чтение данных while (!asResult.IsCompleted) // хранит инф. о сотоянии процесса { // другие действия только здесь... MessageBox.Show("reading from file..."); } // завершение чтения. передается объект IAsyncResult, возвращенный методом Begin() fs.EndRead(asResult); // обработка данных, без нее завершить процесс безсмысленно Decoder d = Encoding.ASCII.GetDecoder(); d.GetChars(byteData, 0, byteData.Length, charData, 0); MessageBox.Show(new string(charData)); fs.Close(); } catch (Exception err) { MessageBox.Show(err.Message); }

Пользователям понравились, и они могли использовать его для своих нужд. Мы сделаем все возможное, чтобы выполнить программу «Привет, мир!» Тремя способами. При обработке файла, содержащего одну строчку. Программа считывает каждую строку файла и отправляет сообщения каждому из них. Поскольку файл содержит одну строку, сообщение отображается только один раз.

Если линия одинаков, вся строка печатается. В этом случае программа будет привязываться к клавиатуре. Вы можете нарисовать линию после строк. После последних строк вы должны указать конец потока трафика. Это похоже на среду, в которой работает программный код. Код читается только для обработки каждой строки фактора. Когда строка считывается, она соответствует указанному шаблону и, если шаблон удовлетворен, выполняются указанные действия.

Другой, более совершенный , способ осуществления доступа к файлам в асинхронном режиме включает использование метода, возвращающего сообщение (о том что операция завершена).

Public class AsyncRead { byte byteData; char charData; public AsyncRead() { byteData = new byte; charData = new char; try { FileStream fs = new FileStream("d:\log.txt", FileMode.Open); fs.Seek(0, SeekOrigin.Begin); // на начало файла // делегат указатель на функцию, которая будет обрабатываться AsyncCallback cb = new AsyncCallback(this.HandleRead); IAsyncResult aResult = fs.BeginRead(byteData, 0, byteData.Length, cb, "read log.txt"); } catch (IOException err) { MessageBox.Show(err.Message); } } // действия которые будут выполняться по завершению обработки public void HandleRead(IAsyncResult ar) { Decoder d = Encoding.ASCII.GetDecoder(); d.GetChars(byteData, 0, byteData.Length, charData, 0); MessageBox.Show(new string(charData)); } … private void button2_Click(object sender, EventArgs e) { AsyncRead ar = new AsyncRead(); // продолжаем основные действия for (int i = 0; i < 50; i++) { MessageBox.Show(i.ToString()); } }

Мы не будем полностью сканировать вас для этого - вам нужно найти свое описание в другом месте. Приведем пример, иллюстрирующий описанные концепции. В этом примере мы сможем рассчитать объем строк в потоке бюллетеней. Приложения имеют полезные комментарии, которые начинаются с симпатичного знака. Кроме того, строка рассматривается как массив полей, разделенных определенной вкладкой.

Таким образом, длина строки 1 идентична длине 1. Нет указанного шаблона, поэтому все линии потока бинов обрабатываются. Вкладка поля может быть не только одним символом. Печатается второе и четвертое поля каждой строки файла. Вы можете проверить, соответствует ли шаблон только одному полю. Для этой цели назначается оператор ~. Он является ведущим оператором «! ~». Это приведет пример.

Создается экземпляр класса AsyncReader, а заме продолжается выполнение – вывод порядковых чисел на консоль; теперь этому методу не приходиться отслеживать процедуру считывания, и он может выполнять какие-либо другие действия, совершенно от этой процедуры не зависящие. Метод HandleRead вызывается системой, когда завершается процедура считывания файла. Это позволяет приложению продолжать обработку какой-либо иной информации, пока выполняется относительно медленная процедура считывания файла.

namespace WindowsApplication1 { public partial class Form1: Form { public Form1() { InitializeComponent(); this.btnOK.Enabled = false; this.LoadOccupation(); this.txtName.Tag = false; this.txtAge.Tag = false; this.txtAddress.Tag = false; this.txtName.Validating += new CancelEventHandler(this.txtBoxEmpty_Validating); this.txtAddress.Validating += new CancelEventHandler(this.txtBoxEmpty_Validating); this.txtAge.Validating += new CancelEventHandler(this.txtBoxEmpty_Validating); this.txtAge.KeyPress += new KeyPressEventHandler(txtAge_KeyPress); this.txtName.TextChanged += new EventHandler(txtBox_TextChanged); this.txtAddress.TextChanged += new EventHandler(txtBox_TextChanged); this.txtAge.TextChanged += new EventHandler(txtBox_TextChanged); } private void btnOK_Click(object sender, EventArgs e) { string output; output = "Имя: " + this.txtName.Text + "rn"; output += "Адрес: " + this.txtAddress.Text + "rn"; output += "Профессия: " + this.cmbOccupation.Text + "rn"; output += "Пол: " + (string)(this.rdoMale.Checked ? "Мужской" : "Женский") + "rn"; output += "Возраст: " + this.txtAge.Text; this.txtOutput.Text = output; } // чтение из файла private void LoadOccupation() { try { // создание объекта StreamReader System.IO.StreamReader sr = new System.IO.StreamReader("occupation.txt"); string input; do { input = sr.ReadLine(); // построчное чтение if (input != "") // пропуск пустых строк this.cmbOccupation.Items.Add(input); } while (sr.Peek() != -1); // -1 возвращается когда достигнут конец потока sr.Close(); } catch (Exception) { MessageBox.Show("Файл не найден"); } } // запись в файл private void SaveOccupation() { try { System.IO.StreamWriter sw = new System.IO.StreamWriter("occupation.txt"); foreach (string item in this.cmbOccupation.Items) { sw.WriteLine(item); // запись } sw.Flush(); // очистка буфера sw.Close(); } catch (Exception) { MessageBox.Show("Файл не найден"); } } private void ValidateAll() { this.btnOK.Enabled = ((bool)(this.txtName.Tag) && (bool)(this.txtAddress.Tag) && (bool)(this.txtAge.Tag)); } private void cmbOccupation_KeyDown(object sender, KeyEventArgs e) { // если Text отсутствует в семействе Items то добавляем его int index = 0; ComboBox cb = (ComboBox)sender; if (e.KeyCode == Keys.Enter) { // осуществ. поиск строки и не является чувствительным к регистру index = cb.FindStringExact(cb.Text); if (index < 0) cb.Items.Add(cb.Text); else cb.SelectedIndex = index; // указывает на то что событие KeyDown нами обработано e.Handled = true; } } } } … protected override void Dispose(bool disposing) { // сохранение элементов SaveOccupation(); if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); }

Цикл while — это лучший способ построчного чтения файла в Linux.

В этой статье я покажу общий синтаксис конструкции while read line в Bash и пример того, как построчно прочитать файл из командной строки в Linux.

Также я приведу пример Bash скрипта, который построчно читает передаваемый ему файл и выводит каждую строку, добавляя к ней определенный текст.

Дельный Совет: Сделайте Bash скрипт интерактивным! Научите его спрашивать «Да/Нет» для подтверждения.

Цикл While Read Line в Bash

Общая структура конструкции while read line , которая может использоваться в Bash скриптах:

While read LINE do COMMAND done

Та же конструкция одной строкой (легко использовать из командной строки в Linux):

While read LINE; do COMMAND; done

В качестве примера выведем список всех пользователей из файла /etc/passwd:

$ while read LINE; do echo "$LINE" | cut -f1 -d":"; done LINE в этой конструкции — это название переменной, в которой сохраняется значение текущей строки во время каждой итерации цикла.

В зависимости от содержимого вашего файла (FILE), для удобства, вы можете назвать эту переменную как вам будет угодно.

Например, если вы храните в файле список пользователей, будет лучше если вместо LINE вы назовете эту переменную USER , и тогда это будет выглядеть таким образом:

$ cat users.txt Eric Kyle Stan Kenny $ while read USER; do echo "Привет $USER!"; done

Дельный Совет: Выполняйте одну команду N раз подряд с помощью цикла FOR в Bash!

Bash Скрипт: Построчное Чтение Файла

Создадим Bash скрипт, который в качестве аргумента получает путь к файлу и печатает слова "Это строка:" в начали каждой строки этого файла.

Создайте пустой файл readfile.sh с помощью команды touch readfile.sh .

Сделайте его исполняемым с помощью chmod +x readfile.sh .

Откройте файл readfile.sh в текстовом редакторе и скопируем туда следующий код:

#!/bin/bash FILE=$1 while read LINE; do echo "Это строка: $LINE" done

Дельный Совет: Не будьте занудой! Сделайте ваш Bash скрипты Ц В Е Т Н Ы М ! Пусть он выглядит ВЕЛИКОЛЕПНО!

Сохраните изменения в запустите скрипт:

$ ./script.sh /etc/passwd Это строка: root:x:0:0:root:/root:/bin/bash Это строка: bin:x:1:1:bin:/bin:/sbin/nologin Это строка: daemon:x:2:2:daemon:/sbin:/sbin/nologin [...]



Есть вопросы?

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: