Файловые потоки

Автор: Пользователь скрыл имя, 07 Июня 2012 в 17:30, курсовая работа

Краткое описание

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

Оглавление

Введение.............................................................................................................. 3
Классы потоков ........................................................................................... 4
Стандартные потоки ...................................................................... 6
Файловые потоки ........................................................................................ 8
2.1. Возможности работы потока
TStream - TFileStream - файловый поток ...........................................8
Работа с файловыми потоками в С++ ........................................................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
Заключение ...........................................................................................................27
Список использованной литературы .............................................

Файлы: 1 файл

КУРСОВАЯ.docx

— 53.92 Кб (Скачать)

              end;

showmessage(p);

FreeMem(p);

   end; 

     Работа  с файловыми потоками весьма быстра, этот класс, являясь классом VCL, в то же время базируется на низкоуровневых функциях Windows, что обеспечивает очень высокую скорость работы и стабильность операций. К тому же многие компоненты и классы VCL поддерживают прямое чтение и запись с файловыми потоками, что занчительно упрощает работу - например TStringList, TBlobField, TMemoField и другие.

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

  1. Работа с файловыми потоками  в с++

     Есть  две возможности: либо использовать функции файлового ввода/вывода, описанные в заголовочном файле STDIO.H, либо функции stream-библиотеки C++. Каждая из этих библиотек имеет множество  мощных и удобных функций.

 
    1. Stream-библиотека С++
 

     Stream-библиотека (известная также как библиотека iostream) выполнена в виде иерархии  классов, которые описаны в  нескольких заголовочных файлах. Файл IOSTREAM.H, используемый до сих  пор, - это только один из них.  Другой, который будет интересен  в этой главе, - FSTREAM.H. Файл IOSTREAM.H поддерживает  основные классы для ввода/вывода  потока. Файл FSTREAM.H содержит определения  для основных классов файлового  ввода/вывода.

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

     Общие функции потокового ввода/вывода

     В этом разделе представлены функции-элементы ввода/вывода, являющиеся общими как  для последовательного, так и  для прямого доступа. Эти функции  включают open, close, good и fail в дополнение к операции . Функция open открывает файловый поток для ввода, вывода, добавления, а также для ввода и вывода. Эта функция позволяет указывать тип данных, с которыми вы собираетесь работать: двоичные или текстовые.

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

     Существуют  некоторые особые тонкости, связанные  с файлами текстового режима, на которые следует обратить особое внимание и запомнить. Первая из них - символ EOF (26 в коде ASCII или Ctrl+Z) - представляет собой метку (символ) конца файла. В текстовом режиме, где встречается  символ EOF, система C++ низкого уровня автоматически продвигается к концу  файла; вы ничего не можете прочитать  после специального символа. Это  может вызвать проблемы, если такой  специальный символ окажется в середине файла.

     Другая  особенность текстового режима заключается  в том, как интерпретируются строки текстового файла. Каждая строка заканчивается  последовательностью конца строки (EOL). На компьютерах под управлением  операционных систем производства Microsoft EOL-последовательность представлена двумя символами кода ASCII: CR (13 в коде ASCII или Ctrl+M) и LF (10 в коде ASCII или Ctrl+J). Эта CRLF-последовательность используется функциями чтения и записи текстовой строки, которые автоматически, вставляют ее в файл или удаляют из него. Заметьте, что на большинстве других, операционных систем (unix-like и Macintosh) EOF просто является символом LF.

    1. Функция-компонент 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;

     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++ Включает в себя набор основных функций, которые контролируют состояние ошибки потоковой операции. Эти функции включают следующие:

  1. Функция good() возвращает ненулевое значение, если при выполнении потоковой операции не возникает ошибки. Объявление функции good: int good();
  2. Функция fail() возвращает ненулевое значение, если при выполнении потоковой операции возникает ошибка. Объявление функции fail: int fail();
  3. Перегруженная операция ! применяется к экземпляру потока для определения состояния ошибки.

     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 для последовательного  двоичного файлового ввода/вывода. Функция write посылает ряд байт  в выходной поток. Эта функция  может записывать любую переменную  или экземпляр в поток.

     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 

     Прототип  для перегруженной функции-компонента 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 (); 
 
 
 
 
 
 
 
 
 

  1. Файловые потоки в NTFS
 

     Операционные  системы от Microsoft семейства Windows NT не возможно себе представить без файловой системы NTFS - одной из наиболее сложных  и успешных среди существующих в  настоящее время файловых систем. Данная глава расскажет вам, какие особенности и недостатки этой системы, на каких принципах основывается организация информации и как поддерживать систему в стабильном состоянии, какие возможности предлагает NTFS и как они могут быть использованы обычным пользователем.  

Информация о работе Файловые потоки