BinaryReader – чтение значений простых типов данных (целочисленных, логических, строковых); BinaryWrier – запись значений тех же типов; Directory – работа с каталогами (папками) с помощью статических методов; DirectoryInfo – работа с каталогами (папками) с помощью динамических методов; File – работа с физическими файлами с помощью статических методов; FileInfo – работа с физическими файлами с помощью динамических методов; FileStream – произвольный (прямой) доступ к файлу, представленному как поток байтов; StreamReader – чтение из файла текстовой информации (однонаправленный поток); StreamWriter – запись в файл текстовой информации (однонаправленный поток).

Из перечня видно, что выполнять обмен с внешними устройствами можно или в двоичном представлении (BinaryReader, Binary-Writer), или в виде байтов (FileStream), или в виде текста (StreamReader, StreamWriter).

Следует помнить про особенность ввода и вывода данных. Текстовая информация хранится в Unicode – один символ представлен двумя байтами. Это обеспечивает корректное отображение символов кириллицы. Вместе с тем, при выводе смешанных текстов вывод латиницы и кириллицы производится по-разному. Эта особенность рассмотрена и подробно обсуждена в [4].

Работа с файловым потоком организуется, в сущности, несложно. Для этого необходимо:

    создать поток; связать поток с файлом (открыть файл); выполнить обмен данными (ввод-вывод); закрыть файл.

Поток – это объект соответствующего класса. Для создания нужного объекта используется конструктор класса. Обычно имеется несколько вариантов конструкторов, с помощью которых можно создавать объекты этих классов различными способами и в различных режимах.

НЕ нашли? Не то? Что вы ищете?

Сделаем ряд важных замечаний. Выбор варианта потока (двоичный, символьный или текстовый) осуществляет программист, исходя из собственных потребностей и предпочтений. При необходимости работы с файлом в режиме прямого доступа текстовый поток не годится. Если элементами (записями) файла являются структуры данных, и предполагается использовать режим прямого доступа, то для обеспечения одинаковой длины каждой записи может потребоваться преобразование в массив двухбайтовых символов (см. пример в [4]).

15.3. РАБОТА С ПОСЛЕДОВАТЕЛЬНЫМИ ФАЙЛАМИ

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

Ниже рассмотрен пример работы с последовательными файлами на примере объектов класса StreamWriter и StreamReader. Эти классы имеют различные методы обслуживания своих объек-тов. Перечислим некоторые из них.

Методы класса StreamReader:

ReadLine – читать строку из потока

ReadBlock – читать блок заданной длины с указанного места в массив символов

ReadToEnd – читать до конца файла

Close – закрыть файл

Методы класса StreamWriter:

Write – записать строку без разделителей строки

WriteLine – записать строку с разделителями строки

NewLine – записать символ конца строки

Close – закрыть файл

Прочие методы и свойства этих классов можно посмотреть в спра-вочной системе среды программирования.

Пример

StreamWriter f1 = new StreamWriter("Текст.txt"); // 1

string s;

int i, j;

Console. Write("Текст:");

f1.Write(Console. ReadLine()); // 2

f1.Close(); // 3

StreamReader f = new StreamReader("Текст.txt"); // 4

s = f. ReadToEnd(); // 5

f. Close();

char[] разделители = { '.', ' ', ',' };

string [] mas = s. Split(разделители); // 6

StreamWriter f2 = new StreamWriter("НовыйТекст.txt"); // 7

for (i = 0; i < mas. Length;i++) // 8

{

if (mas[i] == "") continue;

else s = mas[i];

for (j = i + 1; j < mas. Length;j++)

if (mas[i] == mas[j]) {s = ""; mas[j]="";}

if (s. Length == 0) continue;

f2.WriteLine(s); // 9

}

f2.Close(); // 10

StreamReader f3 = new StreamReader("НовыйТекст.txt"); // 11

for (; ; )

{

if (f3.EndOfStream == true) break; // 12

Console. WriteLine(f3.ReadLine());

}

f3.Close();

В данном примере в текущей папке программы создается выходной файл с именем Текст. txt как текстовый поток f1 (оператор 1). Затем с клавиатуры вводится призвольный текст и в виде строки выводится в файл (оператор 2). Файл закрывается (оператор 3). Затем создается новый поток f для обслуживания того же файла, но уже для чтения (оператор 4). Все данные из файла считываются от начала и до конца в строку s (оператор 5), после чего поток закрывается. С помощью метода Split (оператор 6) строка разбивается на отдельные слова – предполагается, что в строке в качестве разделителей могут быть символы пробел, точка и запятая. Слова сохраняются в массиве. Создается еще один поток f2 для обслуживания нового выходного файла с именем НовыйТекст. txt (оператор 7). В цикле (оператор 8) в этот файл последовательно выводятся только те слова из массива, которые встречаются в нем один раз. Вывод осуществляется оператором 9. Поток закрывается. Открывается еще один поток f3 для обслу-живания того же файла, но для чтения (оператор 11). Слова из файла последовательно считываются и выводятся на экран. Обратите внимание на оператор 12, который определяет, можно ли выполнять чтение. Если достигнут конец файла, то цикл преры-вается. Достигнут ли конец файла, позволяет выяснить свойство EndOfStream, определенное в классе IO. Свойство может иметь значение true или false.

Очевидно, что подобным образом можно обрабатывать любые тексты любым образом в любых последовательных файлах.

15.4. РАБОТА С ФАЙЛАМИ ПРОИЗВОЛЬНОГО ДОСТУПА

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

Ниже рассмотрен пример работы с файлом произвольного доступа с использованием объектов классов FileStream, Binary-Reader и BinaryWriter. Эти классы имеют ряд конструкторов для создания объектов и ряд методов для обслуживания этих объектов. При этом объект класса FileStream является основным объектом-потоком и к нему привязывается файл. Объекты классов Binary-Reader и BinaryWriter являются вспомогательными и обеспечива-ют соответственно простое чтение данных из потока (файла) и запись данных в поток (файл).

Конструктор класса FileStream имеет следующий синтаксис:

FileStream(АФ, РО, РД, РСО)

АФ – это адрес файла, заданный или явной строкой, или строковой переменной;

РО – это режим открытия файла, заданный встроенным перечис-лением FileMode;

РД – это режим доступа к файлу, заданный встроенным перечислением FileAccess;

РСО – это режим совместного использования файла, заданный встроенным перечислением FileShare.

Режимы доступа к файлу содержатся в перечислении FileAccess, которое определено в пространстве имен IO. Список констант этого перечисления:

    Read – открыть файл только для чтения; Write – открыть файл только для записи; ReadWrite – открыть файл для чтения и записи.

Режимы открытия определены в системном перечислении FileMode. Список констант этого перечисления:

    Openоткрыть существующий файл. Если файл с указанным именем не существует, то генерируется исключение. Trancate – открыть существующий файл и очистить его – обрезать до нулевого объема. При отсутствии файла также генерируется исключение. Appendоткрыть существующий файл и установить текущий указатель в конец файла. Если файл не существует, то создать новый файл. Create – создать новый файл. Если файл с таким именем в данной папке уже существует, то он будет уничтожен. CreateNewсоздать новый файл. Если в папке существует файл с данным именем, то генерируется исключение. OpenOrCreateоткрыть существующий файл. Если его нет, то создать новый файл с таким же именем.

При открытии можно описать порядок совместного использования файла несколькими пользователями. Список режимов определен перечислением FileShare:

    None – совместное использование открытого файла запрещено – разрешено работать с ним только одному пользователю. При попытке открытия другим пользователем (повторное открытие) появится сообщение об ошибке. Read разрешено читать нескольким пользователям. Writeразрешено писать сразу нескольким пользователям. ReadWriteмногопользовательский режим для чтения и записи.

Конструкторы классов BinaryReader и BinaryWriter имеют более простой вид:

BinaryReader(объект-поток)

BinaryWriter(объект-поток)

Объект-поток – это обычно переменная класса FileStream.

Пример 1

// объявляется поток байтов

FileStream f;

// задано место размещения файла с помощью обычной строки

string s = ”d:\\study\\primer

// далее выполняется инициализация потока

// с помощью конструктора класса

// создается новый файл для чтения и записи

// отсутствие указания режима FileShare запрещает совместное

// использование файла

f = new FileStream (s, FileMode. Create, FileAccess. ReadWrite);

// создается объект класса BinaryReader, который будет

// использоваться для считывания данных из файла;

// такой объект программисты называют «читателем»

BinaryReader g = new BinaryReader(f);

// создается объект класса BinaryWriter, который будет

// использоваться для записи данных в файл;

// такой объект программисты называют «писателем»

BinaryWriter p = new BinaryWriter(f);

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

Пример 2

class Program

{

static void Main(string[] args)

{

FileStream f; // файловый поток

BinaryReader g; // объект-читатель

BinaryWriter p; // объект-писатель

double x, y; // вещественные числа

string s = @"d:\study\числа"; // адрес и имя файла

// инициализация объекта f и открытие файла

f = new FileStream(s, FileMode. Create, FileAccess. ReadWrite);

g = new BinaryReader( f ); // инициализация читателя

p = new BinaryWriter( f ) // инициализация писателя

int n; // количество чисел в файле

int i, j; // рабочие переменные цикла

// цикл - ввод вещественных чисел

Console. WriteLine("Вводим вещественные числа (до 0)");

do

{

Console. Write("--> ");

y = Convert. ToDouble(Console. ReadLine());

if (y != 0) p.Write(y); // метод Write выводит числа одно

// за другим – каждое число занимает

// в файле 8 байтов

} while (y!= 0);

n = ((int) f. Length) / 8; // так подсчитывается количество // введенных вещественных чисел – через

// свойство Length, т. е. длину потока // (размер файла)

Console. WriteLine("Введено {0} чисел", n);

// вывод массива на экран с помощью функции Вывод

Вывод(f, g);

// сортировка файла по возрастанию методом пузырька

for (i = 0; i < n; i++)

{

for (j = n - 1; j > i; j-)

{

// подвод файла в позицию для ввода

// двух рядом расположенных чисел;

// используется метод Seek, подводящий указатель позиции

// в файле к байту, с которого начинается первое считываемое

// число; счет позиции относительно начала файла

f. Seek( (j-1 ) * 8, SeekOrigin. Begin);

// считывание чисел с помощью метода класса BinaryReader

x = g. ReadDouble(); y = g. ReadDouble();

if (x > y)

{

// подвод указателя к тому же месту, чтобы записать

// числа в файл в другом порядке

f. Seek((j - 1) * 8, SeekOrigin. Begin);

// вывод чисел с помощью метода класса BinaryWriter

p. Write(y); p. Write(x);

}

}

}

Console. WriteLine("Файл после сортировки по возрастанию");

// вывод сортированного файла на экран функцией Вывод

Вывод(f, g);

f.Close(); // закрытие потока и файла

}

static void Вывод(FileStream f, BinaryReader g)

{

// подвод к началу файла – смещение 0 относительно начала

f. Seek(0, SeekOrigin. Begin);

for (int i = 0; i < f. Length/8; i++)

{

Console.WriteLine(g.ReadDouble());

}

}

}

Подобным образом можно работать с любым файлом, содежа-щим любые данные – строки, структуры и т. д.

Список использованной литературы

1.  Павловская, Т. А. С#. Программирование на языке высокого уровня / . – СПб.: Питер, 2007. – 432 с.

2.  Шилдт, Г. C#. Учебный курс / Г. Шилдт. – СПб.: Питер, 2003. – 512 с.

3.  Программирование на языке высокого уровня. Часть 1. Среда Visual Studio: методические указания к лабораторным работам / Сост. ; Волгоград. гос. техн. ун-т. – Волгоград, 2009. – 30 с.

4.  Программирование на языке высокого уровня. Часть 2. Язык C#: методические указания к лабораторным работам / Сост. ; Волгоград. гос. техн. ун-т. – Волгоград, 2009. – 31 с.

ОГЛАВЛЕНИЕ

Ведение……………………………………..…………………

3

1. Что есть программирование…….………………………..

4

2. Структура программы на языек C#.....................................

9

3. Организация данных в языке C#…………………..……..

11

4. Простейшие действия с данными….….……………..…...

15

4.1. Вывод данных на экран………………………………

15

4.2. Присваивание значений переменным……………….

16

4.3. Ввод данных с клавиатуры…………………………..

19

4.4. Арифметические операции………………………….

19

4.5. Поразрядные операции…………………….…………

20

4.6. Преобразование типов……………………………….

21

5. Простейшие операторы языка C#................……………...

23

5.1. Оператор присваивания……………………………..

23

5.2. Вызов метода……….………………………………..

23

5.3. Составной оператор………………………………….

24

6. Операторы ветвления………….………………………….

25

6.1. Операции отношения……………….………………..

25

6.2. Логические операции.……………………………….

26

6.3. Оператор if……………………………………………

26

6.4. Оператор switch……………..……….……………….

27

7. Операторы организации цикла..………………………….

28

7.1. Оператор for………………………………………….

28

7.2. Оператор while……………………………………….

30

8. Операторы перехода………………………………………

31

8.1. Оператор goto…………………………………………

31

8.2. Операторы break и continue………………………….

32

9. Понятие исключения……………………………………..

33

10. Массивы………………………………………………….

37

10.1. Численные массивы………………………………..

38

10.2. Классы Char и Char[]………………………………

41

11. Строки……………………………………………………

44

12. Типы данных, определяемые программистом…………

47

12.1. Перечисления ……………………………………….

48

12.2. Структуры… ……………………………………….

49

13. Функции в C#........……………………………………….

52

13.1. Подпрограммы в языках высокого уровня………..

52

13.2. Метод Main…………………….……………………

57

13.3. Правила описания и вызова функций…….……….

59

13.4. Рекурсивные функции………………………………

65

14. Классы в C#………………………………………………

68

14.1. Классы: чем это удобно…………………………….

68

14.2. Описание и состав класса………………………….

72

14.3. Динамические и статические методы……………..

74

14.4. Классы Math и Random…………………………….

76

15. Классы ввода и вывода………………………………….

79

15.1. Понятие потока……………………………………..

79

15.2. Классы пространства имен System. IO…………..

80

15.3. Работа с последовательными файлами…………….

82

15.4. Работа с файлами произвольного доступа…………

84

Список использованной литературы………………………..

89

Владимир Иванович Кручинин

Программирование на языке C#. Часть 1. Основы языка

Учебное пособие

Редактор

Компьютерная верстка

Темплан 2011 г., поз. № 15К.

Подписано в печать г. Формат 60×84 1/16.

Бумага листовая. Печать офсетная.

Усл. печ. л. 5,35. Уч.-изд. л. 5,23.

Тираж 100 экз. Заказ №

Волгоградский государственный технический университет

г. Волгоград, пр. Ленина, 28, корп. 1.

Отпечатано в КТИ

, каб. 4.5

 

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6