Файловые потоки
Содержание
Введение......................
- Классы потоков
..............................
.............................. .............................. . 4 - Стандартные
потоки ..............................
.............................. .......... 6 - Файловые
потоки ..............................
.............................. ............................ 8
2.1. Возможности работы потока
TStream - TFileStream - файловый поток ..............................
- Работа с
файловыми потоками в С++ ..............................
..........................10 - Stream-библиотека
С++ ..............................
.............................. ........10
- Функция-компонент
open ..............................
.............................. ....11
- Последовательный текстовый поток ввода/вывода .......................13
- Функция-элемент
getline ..............................
.............................. ......13 - Последовательный двоичный файловый ввод/вывод ....................14
- Функция-элемент
write ..............................
.............................. .........15 - Функция-элемент
read ..............................
.............................. ...........16 - Файловый
ввод/вывод с прямым доступом ..............................
......16 - Функция-компонент
seekg ..............................
.............................. ....17 - Файловые
потоки в NTFS ..............................
.............................. .................18 - Физическая
структура NTFS ..............................
.............................. 18 - Обзор структуры
разделов ..............................
.............................. ...19 - Файлы и потоки
..............................
.............................. .....................21 - Работа с
файловыми потоками в NTFS ..............................
.............23 - Работа с
потоками из консоли ..............................
...........................25
Заключение
..............................
Список использованной
литературы ..............................
Введение
Файловые потоки представляют объектно-ориентированный способ чтения и записи информации в дисковые файлы. Библиотека файловых потоков разработана для работы только с текстовыми файлами. Однако можно применить ее и для чтения и записи двоичных значений, текстов, структур или любых других объектов.
Для работы с потоками на С++ ofstream и ifstream создаются следующие классы:
- Ofstream- для вывода (записи) данных в файл;
- Ifstream- для ввода (чтения) данных из файла;
- Fstream – для ч тения для записи данных.
Чтобы использовать эти классы, в текст программы необходимо включить дополнительный заголовочный файл fstream.h. После этого в программе определяют файловые потоки, соответствующих типов.
Например:
- Ofstream outFile; // Ввыходной файловый поток.
- Ifstream inFile; // Входной файловый поток.
- Fstream ioFile; // Файловый поток для ввода и вывода.
Создание файлового потока связывает имя потока с выделяемым для него буфером и инициализирует переменные состояния потока. Потому что перечисленные классы файловых потоков наследует свойства класса ios , то и переменные состояние каждого файлового потока наследуется из базового класса . так как файловые классы являются производными от класса ostream, istream, stream, то они поддерживают описанный в предыдущих шагах форматированный и бесформативный обмен с файлами. Необходимо открыть соответствующий файл и связать его с файловым потоком.
- Классы потоков
Классы,
связанные с потоками С++, содержат
расширяемые библиотеки, позволяющие
выполнять форматированный
Потоком будем называть понятие, относящееся к любому переносу данных от источника (или поставщика данных) к приемнику (или потребителю) данных. Несмотря на свое имя, класс потока может быть использован для форматирования данных в ситуациях, не подразумевающих реального выполнения ввода/вывода. Так, форматирование в памяти можно применять к символьным массивам и прочим структурам.
В файле iostream.h имеется два параллельных класса: streambuf и ios. Оба они являются классами низкого уровня, и каждый выполняет свой круг задач.
Класс
streambuf обеспечивает общие правила
буферизации и обработки
Класс ios (и, следовательно, производные от него классы) содержит указатель на streambuf.
Класс ios имеет два производных класса: istream (для ввода) и ostream (для вывода). Другой класс, iostream, является производным классом сразу от istream и ostream вследствие множественного наследования:
class
ios;
class istream: virtual public ios;
class ostream: virtual public ios;
class iostream: public istream, public ostream;
Кроме того, существует три класса _withassign, являющихся производными классами от istream, ostream и iostream:
class
istream_withassign: public istream;
class ostream_withassign: public ostream;
class iostream_withassign: public iostream;
Класс ios содержит переменные состояния для интерфейса с streambuf и обработки ошибок.
Класс
istream поддерживает как форматированные,
так и неформатированные
Класс
ostream поддерживает как форматированные,
так и неформатированные
Класс iostream объединяет классы istream и ostream для двунаправленных операций, в которых один поток действует и как источник, и как приемник.
Производные
классы _withassign обеспечивают четыре предопределенных
"стандартных" потока: cin, cout, cerr и
clog, описываемые в следующем
class
istream_withassign: public istream {
istream_withassign();
istream& operator = (istream&);
istream& operator = (streambuf*);
}
и аналогично для ostream_withassign и iostream_withassign.
Классом потока называется любой класс, производный от классов istream и ostream.
- Стандартные потоки
Выполнение любой программы С++ начинаются с четырьмя предопределенными открытыми потоками, объявленными как объекты классов _withassign в iostream.h следующим образом:
extern istream_withassign cin; extern ostream_withassign cout; extern ostream_withassign cerr; extern ostream_withassign clog;
Их
конструкторы вызываются всякий раз
при включении iostream.h, но фактическая
инициализация выполняется
Все эти предопределенные стандартные потоки по умолчанию связаны с терминалом.
Четыре стандартных потока предназначены для:
cin
- стандартного ввода;
cout - стандартного вывода;
cerr - стандартного вывода ошибок;
clog - полностью буферизованного вывода
ошибок.
В табл. 5 приведено назначение классов потокового ввода-вывода.
Таблица 5
Назначение классов потокового ввода-вывода
| ||||||||||||||||||||||||||||||||||||||||||
Назначение
почти всех классов следует из
их названия. Классы группы _withassign являются
производными соответствующих потоковых
классов без этого окончания.
Они перегружают операцию присваивания,
что позволяет изменять указатель
на используемый классом буфер.
- Файловые потоки
- Возможности работы потока TStream - TFileStream - файловый поток
Этот класс был специально введен для работы с файлами.
Для работы с файловым потоком надо записать в Uses модули classes, Sysutils (classes - включает в себя собственно определение класса, Sysutils - некоторые константы необходимые для работы).
Пример записи/перезаписи файла:
Procedure WriteFileUsingStream(s, FileName:string);
begin with TFileStream.create(FileName, fmCreate or fmOpenWrite) do
try
write(pointer(s)^,length(s));
finally
free;
end;
end;
TFileStream.create - конструктор класса, его вызов требует указания имени файла и опций его открытия, следующие опции определены:
fmCreate = $FFFF;
fmOpenRead = $0000;
fmOpenWrite = $0001;
fmOpenReadWrite = $0002;
fmShareCompat = $0000;
fmShareExclusive = $0010;
fmShareDenyWrite = $0020;
fmShareDenyRead = $0030;
fmShareDenyNone = $0040;
Метод Write - этим методом в файл пишется любая информация из буфера любого типа, указывается только буффер и количество записываемых байтов. В данном случае используется переменная String в качестве буффера, но так как для длинных строк она представляет собой лишь указатель, то конструкция "pointer(s)^" заставляет обращаться именно к ее содержимому.
Следующий код демонстрирует чтение файла с использованием файлового потока:
var p:PChar;
begin GetMem(p, 255);
with
TFileStream.create('c:\myText.
try
Seek(10,soFromBeginning);
read(p^, 254);
finally
free;
end;
showmessage(p);
FreeMem(p);
end;
Работа с файловыми потоками весьма быстра, этот класс, являясь классом VCL, в то же время базируется на низкоуровневых функциях Windows, что обеспечивает очень высокую скорость работы и стабильность операций. К тому же многие компоненты и классы VCL поддерживают прямое чтение и запись с файловыми потоками, что занчительно упрощает работу - например TStringList, TBlobField, TMemoField и другие.
Файловые
потоки могут быть рекомендованы
к использованию в большинстве
случаев для чтения и записи файлов
(за исключением специфических
- Работа с файловыми потоками в с++
Есть
две возможности: либо использовать
функции файлового ввода/ вывода,
описанные в заголовочном файле
STDIO.H, либо функции stream-библиотеки C++. Каждая
из этих библиотек имеет множество
мощных и удобных функций.
- Stream-библиотека С++
Stream-библиотека
(известная также как
Существуют
дополнительные файлы библиотеки ввода/вывода,
в которых имеются более
Общие функции потокового ввода/вывода
В этом разделе представлены функции-элементы ввода/вывода, являющиеся общими как для последовательного, так и для прямого доступа. Эти функции включают open, close, good и fail в дополнение к операции . Функция open открывает файловый поток для ввода, вывода, добавления, а также для ввода и вывода. Эта функция позволяет указывать тип данных, с которыми вы собираетесь работать: двоичные или текстовые.
При работе с файловым вводом/выводом очень важно знать различие между текстовым и двоичным режимами. Текстовый режим предназначен для текстовых файлов, в которых имеются строки обычного текста. Двоичный режим используется для любых других и особенно для файлов, которые сохраняются в форматах, неудобных для чтения человеком.
Существуют некоторые особые тонкости, связанные с файлами текстового режима, на которые следует обратить особое внимание и запомнить. Первая из них - символ EOF (26 в коде ASCII или Ctrl+Z) - представляет собой метку (символ) конца файла. В текстовом режиме, где встречается символ EOF, система C++ низкого уровня автоматически продвигается к концу файла; вы ничего не можете прочитать после специального символа. Это может вызвать проблемы, если такой специальный символ окажется в середине файла.
Другая
особенность текстового режима заключается
в том, как интерпретируются строки
текстового файла. Каждая строка заканчивается
последовательностью конца
- Функция-компонент open
Прототип функции open
void open (const char* filename, int mode, int m = filebuf::openprot);
Параметр filename задает имя открываемого файла. Параметр mode указывает режим ввода/вывода. Далее следует список аргументов для mode, описанных в заголовочном файле FSTREAM.H:
- in открыть поток для ввода,
- out открыть поток для вывода,
- ate установить указатель потока на конец файла,
- app открыть поток для добавления,
- trunk удалить содержимое файла, если он уже существует (bc++5),
- nocreate инициировать ошибку, если уже не существует,
- noreplace инициировать ошибку, если файл уже существует,
- binary открыть в двоичном режиме.
Пример 1.
// открыть поток для ввода
fstream f;
f.open("simple.txt", ios::in);
// открыть поток для вывода fstream f;
fstream f;
f.open ("simple.txt", ios::out);
//
открыть поток ввода/вывода
fstream f;
f.open("simple.txt", ios::in | ios::out | ios::binary);
Функция close закрывает поток и освобождает использовавшиеся ресурсы. Эти ресурсы включают буфер памяти для операции потокового ввода/вывода.
Прототип для функции close:
void close();
Пример 2.
fstream f;
// открыть поток
f.open ( "simple.txt", ios::in);
// работа с файлом
// закрыть поток
f.close ();
Stream-библиотека C++ Включает в себя набор основных функций, которые контролируют состояние ошибки потоковой операции. Эти функции включают следующие:
- Функция good() возвращает ненулевое значение, если при выполнении потоковой операции не возникает ошибки. Объявление функции good: int good();
- Функция fail() возвращает ненулевое значение, если при выполнении потоковой операции возникает ошибка. Объявление функции fail: int fail();
- Перегруженная операция ! применяется к экземпляру потока для определения состояния ошибки.
Stream-библиотека
C++ предоставляет дополнительные
функции для установки и
3.3. Последовательный текстовый поток ввода/вывода
Функции и операции последовательного текстового ввода/вывода являются довольно простыми. Эти функции и операции включают:
- Операция извлечения из потока << записывает строки или символы в поток.
- Операция помещения в поток >> читает символы потока.
- Функция getline читает строку из потока.
3.4. Функция-элемент getline
Прототипы функции-элемента getline:
istream& getline (char* buffer, int size, char delimiter = '\n');
istream& getline (signed char* buffer, int size, char delimiter = '\n');
istream& getline (unsigned char* buffer, int size, char delimiter = '\n');
Параметр buffer - это указатель на строку, принимающую символы из потока. Параметр size задает максимальное число символов для чтения. Параметр delimiter указывает разделяющий символ, который вызывает прекращение ввода строки до того, как будет введено количество символов, указанное в параметре size. По умолчанию параметру delimiter присваивается значение '\n'.
Пример 3.
fstream f;
char textLine[MAX];
f.open("sample.txt", ios::in);
while (!f.eof()) {
f.getline(textLine, MAX);
cout << textLine << endl;
}
f.close();
3.5. Последовательный двоичный файловый ввод/вывод
Stream-библиотека
C++ имеет перегруженные потоковые
функции-элементы write и read для последовательного
двоичного файлового ввода/
3.6. Функция-элемент write
Прототип
перегруженной функции-
ostream& write(const char* buff, int num);
ostream& write(const signed char* buff, int num);
ostream& write(const unsigned char* buff, int num);
Параметр buff - это указатель на буфер, содержащий данные, которые будут посылаться в выходной поток. Параметр num указывает число байт в буфере, которые передаются в этот поток.
Пример 4.
const MAX = 80;
char buff[MAX+1] = "Hello World!";
int len = strlen (buff) + 1;
fstream f;
f.open("CALC.DAT", ios::out | ios::binary);
f.write((const unsigned char*) &len, sizeof(len));
f.write((const unsigned char*) buff, len);
f.close();
В этом примере открывается файл CALC.DAT, записывается целое, содержащее число байт в строке и записывается сама строка перед тем, как файл закрывается.
Функция
read считывает некоторое количество
байт из входного потока. Эта функция
может считывать любую
3.7.
Функция-элемент read
Прототип перегруженной функции-элемента read:
ostream& read(char* buff, int num);
ostream& read(signed char* buff, int num);
ostream& read(unsigned char* buff, int num);
Параметр buff - это указатель на буфер, который принимает данные из входного потока. Параметр num указывает число считываемых из потока байт.
Пример 5.
const MAX = 80;
char buff [MAX+1];
int len;
fstream f;
f.open("CALC.DAT", ios::in | ios::binary);
f.read((unsigned char*) &len, sizeof(len));
f.read((unsigned char*) buff, len);
f.close();
В
этом примере считывается
3.8.
Файловый ввод/вывод
с прямым доступом
Файловые операции ввода/вывода прямого доступа также используют потоковые функции-элементы read и write, представленные в предыдущем разделе. Stream-библиотека имеет ряд функций, позволяющих передвигать указатель потока в любое необходимое положение. Функция-элемент seekg - одна из таких функций.
3.9.
Функция-компонент seekg
Прототип
для перегруженной функции-
istream& seekg(long pos);
istream& seekg(long offset, seek_dir dir);
Параметр pos в первой версии определяет абсолютное положение байта в потоке. Во второй версии параметр offset определяет относительное смещение, в зависимости от аргумента dir. Аргументы для последнего параметра:
ios::beg С начала файла
ios::cur С текущей позиции файла
ios::end С конца файла
Пример 6.
const BLOCK SIZE = 80
char buff[BLOCK_SIZE] = "Hello World!";
f.open("CALC.DAT", ios::in | ios::out | ios::binary);
f.seekg(3 * BLOCK_SIZE); // продвинутся к блоку 4
f.read((const unsigned char*)buff, BLOCK_SIZE);
cout < buff < endl;
fclose
();
- Файловые потоки в NTFS
Операционные
системы от Microsoft семейства Windows NT не
возможно себе представить без файловой
системы NTFS - одной из наиболее сложных
и успешных среди существующих в
настоящее время файловых систем.
Данная глава расскажет вам, какие особенности
и недостатки этой системы, на каких принципах
основывается организация информации
и как поддерживать систему в стабильном
состоянии, какие возможности предлагает
NTFS и как они могут быть использованы обычным
пользователем.