Текстовые файлы

Примеры

Специальные операции

Операции ввода-вывода

Установочные и завершающие операции

Общие сведения

Двоичные файлы

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

При работе с файлами выполняются операции ввода - вывода. Операция ввода означает перепись данных с внешнего устройства (из входного файла) в основную память ЭВМ, операция вывода - это пересылка данных из основной памяти на внешнее устройство (в выходной файл). Файлы на внешних устройствах часто называют физическими файлами. Их имена определяются операционной системой. В программах имена файлов задаются с помощью строк. Например, имя файла на диске может иметь вид:c: empmyfile.dat.

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

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

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

§ установочные и завершающие операции

§ операции ввода-вывода

§ специальные операции

Для подключения возможностей по работе с файлами необходимо добавить пространство имён System.IO в программу.

using System.IO;

Используя классы BinaryWriter и BinaryReader можно создать свои файловые объекты для выполнения различных файловых операций

//создание нового файла или перезапись существующегоBinaryWriter outBin = new BinaryWriter (File.Open("c: empa1.dat", FileMode.Create ));//outBin - созданный нами объект //открытие существующего файла на чтениеBinaryReader inBin = new BinaryReader (File.Open("c: empa1.dat", FileMode.Open));//inBin - созданный нами объект

Атрибут FileMode может быть выбран из следующего списка

FileMode.Append // открыть файл для дозаписиFileMode.Create // создание нового файла или перезапись существующегоFileMode.Open //открытие существующего файла на чтение

Для завершения работы с файлом используют метод Close.

outBin.Close();

Для записи в открытый файл используют метод Write.

outBin.Write(22.4);outBin.Write("Хелло ворлд!");outBin.Write(15);

Для чтения данных из открытого файла используют метод Read

Double m = inBin.ReadDouble();string q = inBin.ReadString();int j = inBin.ReadInt32();

Для проверки, достигнут ли конец файла при чтении используют метод PeekChar

while ((inBin.PeekChar())>=0) { e = inBin.ReadInt32(); Console.WriteLine(e); }

Удаление файла выполняется методом Delete объекта File:

string fileName = "c: empa1.txt";File.Delete(fileName);

Проверка существования файла выполняется методом Exist объекта File:

if (File.Exist("c: empa1.txt")) {//программный код, который//выполнится если файл существует}

Переименование/перенос файла выполняется методом Move объекта File:

string path = @"c: empMyTest.txt";string path2 = @"c: empMyTest.bak";File.Move(path, path2);Console.WriteLine ("Файл {0} был переименован в {1}.", path, path2);

Пример 1: Создать файл, содержащий целые числа. Из компонентов исходного файла сформировать файл, записав в него числа, расположенные в исходном файле до максимального элемента. Массивы использовать нельзя.

static void CreateFile(string filename) { BinaryWriter outBin = new BinaryWriter (File.Open(filename, FileMode.Create)); Console.Write("Введите количество элементов для записи в файл "); string s = Console.ReadLine(); int n = Convert.ToInt32(s); for (int i = 1; i <= n; i++) { Console.Write("Введите {0}-й элемент файла ",i); s = Console.ReadLine(); int m = Convert.ToInt32(s); outBin.Write(m); } outBin.Close(); } static int FindMax(string filename) { BinaryReader inBin = new BinaryReader (File.Open(filename, FileMode.Open)); int e , i,max,maxnum; e=i = maxnum = max = 0; while ((inBin.PeekChar())>=0) { e = inBin.ReadInt32(); if (i > 0) if (e > max) { max = e; maxnum = i; } else ; else max = e; i++; } inBin.Close(); return maxnum; }static void DoNewFile(string filename1,string filename2,int maxnum) { BinaryReader inBin = new BinaryReader (File.Open(filename1, FileMode.Open)); BinaryWriter outBin = new BinaryWriter (File.Open(filename2, FileMode.Create)); for (int i = 0; i < maxnum; i++) { int e = inBin.ReadInt32(); outBin.Write(e); } inBin.Close(); outBin.Close(); }static void PrintFile(string filename) { BinaryReader inBin = new BinaryReader (File.Open(filename, FileMode.Open)); while ((inBin.PeekChar()) >= 0) { int e = inBin.ReadInt32(); Console.WriteLine(e); } inBin.Close(); }static void Main(string[] args) { CreateFile("c:s1.dat"); int mn=FindMax("c:s1.dat"); DoNewFile("c:s1.dat", "c:s2.dat", mn); PrintFile("c:s2.dat"); Console.ReadKey(); }