Смекни!
smekni.com

Основы алгоритмизации и программирования 2 (стр. 31 из 32)

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

5. Запустите приложение – текст, хранящийся в файле, будет выведен на экран.

Как это работает – Входной поток

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

Для чтения текста из файла использован метод ReadLine(). Этот метод осуществляет считывание текста до того момента, когда будет обнаружен символ "возврат каретки", и возвращает считанный текст в виде строки. В случае, если будет достигнут конец файла, то данный метод возвращает значение null, что используется при выполнении проверки достижения конца файла:

strLine = sr.ReadLine (); while(strLine != null) {

Console.WriteLine(strLine) ; strLine = sr.ReadLine () ; }

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

8.4.1.Чтение данных

Метод ReadLine() не является единственным способом доступа к данным в файле. Класс StreamReader имеет несколько способов для чтения данных.

Простейший из них – Read(). Он возвращает следующий символ в виде положительного целого числа или значения 1, если достигнут конец. С помощью переводного класса Convert это значение может быть преобразовано в символ. В приведенном выше примере основная часть программы может быть переписана следующим образом.

int nChar; nChar = sr. Read () ; while(nChar != -1) {

Console.Write(Convert.ToChar(nChar)); nChar = sr.Read(); }

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

strLine = sr.ReadToEnd(); Console.WriteLine(strLine);

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

8.4.2.Файлы с ограничителем

Распространенным способом хранения данных в файле является разделение данных запятыми. Мы уже сталкивались с использованием класса StreamWriter для записи файлов с использованием такого подхода. Не менее просто оказывается читать файлы, использующие запятые в качестве разделителя. В класс String включен метод с названием Split(), который используется для преобразования строки в массив с использованием заданного символа в качестве разделителя. Если мы зададим режим использования запятой в качестве разделителя, то это приведет к созданию строкового массива требуемой размерности, в котором будет содержаться вся информация из исходной строки.

ПРАКТИКУМ. Файлы с использованием запятой в качестве разделителя

1. Создайте новый проект. Выберите пункт меню С# Console Application и назовите его CommaValues.

2. Добавьте соответствующую строку в начало файла Class1.cs:

using System;
using System. IO

;

3. Добавьте следующий код в метод Main():

static void Main(string [] args) {
string strLine;
string[] strArray;

char [ ] charArray = new Char[] {','); try {

FileStream aFile = new FileStream("Log.txt",FileMode.Open);

StreamReader sr = new StreamReader(aFile) ; strLine = sr.ReadLme(); while(strLine !=null) { // Преобразование строк данных в массив строк strArray = strLine.Split(charArray);

// Проход в цикле по массиву строк и вывод их на печать for(int x=0;x<=strArray.GetUpperBound(0);х++)

{

Console. WriteLine (strArray [x] .Trim()) ; } strLine = sr. ReadLine (); } sr.Close() ;

Console.ReadLine () ; } catch(IOException e) {

Console.WriteLine("An IO exception has been thrown!");

Console.WriteLine(e.ToString ());

Console.ReadLine(); return; }

return; }

4. Откройте Notepad и введите в него следующий текст:

Amanda, Kay, Sandy, Dan, Rob Natalie, Kate, David, Zoe, Andrew

5. Сохраните файл под именем log.txt в директории CommaValues&bsol;bin&bsol;Debug или директории, где будет запускаться выполняемый файл вашего приложения.

6. Запустите приложение – вы увидите выведенный на консоль текст файла.

Как это работает – Файлы с использованием запятой в качестве разделителя

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

strArray = strLine.Split(charArray);

Данный метод принимает строковый массив, созданный ранее. Обратите внимание, что в настоящем примере в массиве содержится единственный символ – запятая. Мы могли бы записать в массив несколько символов; в таком случае каждый раз, когда в файле будет встречен любой из указанных символов, он будет рассматриваться в качестве допустимого ограничителя поля. Например, в следующем коде создается символьный массив, в который помещается сразу несколько символов. Теперь, в случае если метод Split будет вызван для строки "Please split?this|string up", то в строковом массиве будут возвращены все слова по отдельности, поскольку все символы, расположенные между словами, будут рассматриваться методом Split в качестве разделителей (пробел, вопросительный знак и вертикальная черта):

char[] charArray = new Char[] {'?',' ','|'};
strArray = "Please split?this | String up".Split(charArray);

После получения строкового массива он просматривается в цикле, а его содержимое выводится на консоль. Это достигается за счет использования обычного цикла for. Обратите внимание на то, что мы вызываем метод Trim() класса String. Этот метод удаляет все пустое пространство (пробелы и символы табуляции) в начале и в конце строк. Мы делаем это, поскольку нас не интересуют пробелы в начале и конце данных – нас интересуют только сами имена. Такой подход не всегда подойдет для ваших приложений, поскольку пустое пространство может оказаться значимым:

for(int x=0;x<=strArray.GetUpperBound(0);х++) {
Console.WriteLine(strArray[x].Trim))); }

Как легко заметить, извлечение данных из файлов, в которых в качестве разделителя переменных используется запятая (comma-separated variable – CSV), в .NET Framework не представляет никакого труда. Хотя в данном случае приведенный пример оказывается очень простым, вы столкнетесь с тем, что эти принципы используются в бизнес-приложениях уровня целого предприятия. Несмотря на то, что XML является намного превосходящим по всем параметрам методом хранения и передачи данных, использование CSV-файлов по-прежнему очень распространено и будет распространено еще в течение некоторого времени. Преимуществом файлов, в которых используются ограничители, заключается еще и в том, что они являются очень компактными и, следовательно, занимают меньше места, чем их XML-аналоги

Файлы с ограничителями используются многими системами, и если вашему приложению придется взаимодействовать с такой системой, то вы обнаружите, что формат данных с использованием ограничителей применяется достаточно часто. Обратите внимание на то, что, хотя мы и уделяли основное внимание файлам, в которых в качестве разделителя используется запятая, в этом качестве вполне может использоваться и символ табуляции – такой формат также является весьма распространенным. Следует также помнить, что CSV-файлы могут экспортироваться и импортироваться такими системами, как Excel, Access и многими реляционными базами данных.

8.5. Вопросы для повторения

1. Понятие потоков.

2. Кляссы ввода и вывода.

3. Классы File, FileInfo.

4. Классы Directory, DirectoryInfo.

5. Класс FileStream.

6. Объекты StreamReader, StreamWriter.

7. Форматирование данных.

ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ

1. Ввести N чисел. Напечатать из них М самых больших.

2. Напечатать строку матрицы с максимальной суммой элементов.

3. Отсортировать строки матрицы в порядке убывания их максимального элемента.

4. Заданы координаты N - точек плоскости (Xi, Yi), i=1,N. Найти точки расстояние между которыми максимально, и точки расстояние между которыми минимально.

5. Найти длину замкнутой ломаной линии, заданной координатами точек излома (Xi, Yi), i=1,N. Определить пересекает она сама себя или нет.

6. В матрице найти наименьший из положительных элементов.

7. Отсортировать строки матрицы в порядке убывания суммы их элементов.

8. Напечатать фрагмент матрицы (строку и столбец), содержащие ее максимальный элемент.

9. Напечатать фрагмент матрицы в противоположных углах которого стоят ее максимальный и минимальный элементы.

10.Заполнить и вывести на печать треугольник Паскаля заданного размера.

11.Вектор В(N) заполнить случайными числами от -9 до 9. Напечатать его фрагмент расположенный между максимальным и минимальным элементом и вычислить сумму квадратов элементов этого фрагмента.

12.Заполнить матрицу случайными числами от 0 до 9. Сформировать два вектора. Первый содержит элементы побочной диагонали и выше. Второй - элементы ниже побочной диагонали. Отсортировать первый по убыванию, второй по возрастанию элементов.

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

14.В матрице найти прямоугольник максимальной площади в углах которого стоят одинаковые числа.