Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Следует отметить, что оба подхода могут быть применены для фалов любых типов, их выбор не жестко определяется содержимым файла




Краткие сведения о работе с файлами.

Теоретическая часть.

 

 

Файл – это поименованная область данных, расположенная во внешней памяти компьютера (на всевозможных внешних устройствах) или в оперативной памяти.

Имя файла является наряду с путем (совокупностью каталогов (папок), пройдя через которые можно достигнуть интересующего файла, причем для DOS длина полного пути не должна превышать 80 символов) являются важнейшими параметрами, описывающими файл. Имя файла – это некоторый набор символов (до 8 – для DOS, до 255 – для Windows 9x/NT/2000/XP). Некоторые имена файлов являются особыми, т.к. на самом деле соответствуют определенным устройствам, например:

con – при вводе данных соответствует клавиатуре, при выводе – дисплею.

nul – несуществующее устройство. Запись в файл с таким именем эквивалентна записи в никуда, т.е. отсутствия записи данных.

 

Для работы с файлами в языке C++ предусмотрено два несколько различных подхода: работа с файлами, как с потоками ввода/вывода, с использованием указателя на структуру FILE, и работа с файлами на низком уровне через дескрипторы файлов (неотрицательные целочисленные значения). Следует отметить, что существует возможность комбинировать эти подходы при работе с файлом, т.к. возможности, предоставляемые ими, несколько отличаются, дополняя, при этом, друг друга.

При использовании функций, требующих для своей работы указателя на структуру FILE, необходимо подключить stdio.h, а при использовании функций, требующих для своей работы дескриптора файла - io.h и fcntl.h, sys/stat.h (в двух последних файлах заголовков описаны константы).

Рассмотрим общую схему работы с файлами:

1. Открыть файл, используя его имя (при необходимости полный путь к нему).

2. Если открытие прошло удачно,

a) выполнение навигационных операций и операций ввода/вывода;

b) закрытие файла.

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

Таблица 1. Функции для работы с файлами

на языке С++

№ шага Прототип функции Назначение функции
  FILE *fopen ( const char* filename, const char* mode ); FILE *_fdopen ( int fd, const char* mode ); Получает указатель на структуру FILE, если файл уже открыт и имеется его дескриптор (fd). Работа аналогична fopen. int _fileno( FILE *stream ); Получает дескриптор уже открытого потока (файла). Если аргумент NULL, то функция вернет -1. Если аргумент не указывает на открытый файл, то поведение функции не определено. FILE *freopen ( const char* filename, const char* mode FILE *stream ); Связывает указатель на структуру FILE(3-ий аргумент) с новым файлом. Файл, связанный с 3-им аргументом, будет закрыт. Работа аналогична fopen. int _open ( const char* filename, int flag [, int pmode] ); int _creat ( const char* filename, int pmode ); Открывает файл, возвращая его дескриптор (-1 в случае ошибки). Подобна _openв режиме _O_CREAT. Открывает файл. 1-ый аргумент задает имя файла (можно указывать путь), а 2-ой аргумент - режим открытия файла. Рассмотрим некоторые допустимые значения 2-ого аргумента: ”r”- открывает файл для чтения. Файл должен существовать. ”w” -открывает (создает) пустой файл для записи. Если файл существует, то его содержимое уничтожается. ”a” - открывает для записи в конец файла (маркер EOF (символ с кодом 26) остается до тех пор, пока не будет произведена запись). Если файл не существует, то он создается. ”r+” - открывает файл для чтения и для записи. Файл должен существовать. ”w+” -открывает (создает) пустой файл для записи и для чтения. Если файл существует, то его содержимое уничтожается. ”a+” - открывает для записи в конец файла и для чтения (маркер конца файла (символ с кодом 26) остается до тех пор, пока не будет произведена запись). Если файл не существует, то он создается. Следует отметить, что 1. В режимах ”r+”, ”w+” и ”a+”при переключении между чтением и записью требуется вызвать одну из следующих функций: fflush, fsetpos, fseek, rewindдля выполнения позиционирования. 2. В режимах ”a”и ”a+”запись производится ТОЛЬКО в конец файла, даже если переместить указатель та текущую позицию в начало. Кроме вышерассмотренных основных режимов могут использоваться (совместно с ними, указываются после основного режима) дополнительные режимы, влияющие на кеширование, интерпретацию некоторых символов, раскладку символов (работает только в Visual Studio 2005 и выше) и т.п. Рассмотрим некоторые из них: ”t” - файл открывается в текстовом режиме. В результате перевод строки интерпретируется как один символ, CTRL+Z интерпретируется как признак конца файла. ”b” - файл открывается в бинарном режиме. Никаких специальных интерпретаций символов не происходит. Несовместим с ”t”. ”S” - используется оптимизация для последовательного считывания данных из файла. ”R” - используется оптимизация для случайного считывания данных из файла. ”T” - признак временного файла. Если возможно, то содержимое буфера, используемого при работе с файлом, не сбрасывается на диск. ”D” - признак временного файла. Автоматически удаляется, когда с ним прекращается работа (он закрывается). Следует отметить, что режимы ”S”, ”R”, ”T”, ”D”могут применяться только при использовании компиляторов Microsoft. Через свое имя функция возвращает указатель на структуру FILE, которая соответствует открытому файлу. Если при открытии файла возникли ошибки, то возвращается NULL.   Открывает файл, возвращая его дескриптор (-1 в случае ошибки). 1-ый аргумент - имя файла (можно указывать путь). 2-ой аргумент задает режим открытия файла с помощью целочисленной константы (возможны объединения основных и дополнительных режимов с помощью операции |), для использования которых необходимо подключить файл fcntl.h. Рассмотрим некоторые допустимые значения 2-ого аргумента: _O_RDONLY - эквивалентен режиму ”r” функции fopen. Несовместим с режимами _O_RDWR, _O_WRONLY. _O_WRONLY - эквивалентен режиму ”w” функции fopen. Несовместим с режимами _O_RDWR, _O_RDONLY. Обычно используется в такой комбинации: _O_WRONLY | _O_CREAT | _O_TRUNC. _O_RDWR - эквивалентен режиму ”r+”или ”w+” функции fopen. Несовместим с режимами _O_WRONLY, _O_RDONLY. Обычно используется в такой комбинации: _O_RDWR | _O_CREAT | _O_TRUNC. _O_APPEND - в комбинации _O_WRONLY | _O_CREAT | _O_APPEND эквивалентен режиму ”a” функции fopen. _O_CREAT - создается новый файл. Если файл существует, то ни к чему не приводит. В этом случае необходимо с помощью 3-го необязательного аргумента указать права доступа к файлу, которые будут введены в действия после его закрытия. Допустимые значения 3-го аргумента (возможны их объединения через операцию |): 1. _S_IREAD - только чтение. 2. _S_IWRITE - только запись (хотя на самом деле чтение тоже допустимо). _O_TRUNC - открывает файл и «усекает» его длину до 0 байт. Совместно с _O_CREAT позволяет создавать новые файлы. Вспомогательные режимы: _O_TEXT - эквивалентен режиму ”t” функции fopen. _O_BINARY - эквивалентен режиму ”b” функции fopen. _O_SEQUENTIAL - эквивалентен режиму ”S” функции fopen. _O_RANDOM - эквивалентен режиму ”R” функции fopen. Комбинации режимов: _O_CREAT | _O_SHORT_LIVED - эквивалентен режиму ”wT” функции fopen. _O_CREAT | _O_TEMPORARY - эквивалентен режиму ”wD” функции fopen. _O_CREAT | _O_EXCL - возвращает ошибку, если файл существует. _O_RDWR | _O_CREAT | _O_APPEND - эквивалентен режиму ”a+” функции fopen.
  Проверка успешности открытия файла. Производится путем сравнения указателя на структуру FILE со значением NULL или дескриптора файла со значением -1. Если не равно, то файл открыт успешно.
2 a)     Функции для потокового ввода / вывода: int fscanf ( FILE *stream, const char *format, arguments ); int fprintf ( FILE *stream, const char *format, arguments ); size_t fread ( void *buffer, size_t size, size_t count, FILE *stream ); size_t fwrite ( void *buffer, size_t size, size_t count, FILE *stream ); int fgetc ( FILE *stream ); char *fgets ( char *str, int n, FILE *stream ); int fputc ( int c, FILE *stream ); int fputs ( const char *str, FILE *stream ); int feof ( FILE *stream ); int fflush ( FILE *stream ); int _flushall () int setvbuf ( FILE *stream, char *buffer, int mode, size_t size ); После открытия файла можно применять функции ввода / вывода, изменять / получать указатель на текущую позицию в файле, сбрасывать буфер ввода / вывода на диск (при записи данных).   Аналогична scanf, но в отличие от нее позволяет работать с любым входным потоком, который определяется 1-ым аргументом.   Аналогична printf, но в отличие от нее позволяет работать с любым выходным потоком, который определяется 1-ым аргументом.   Предназначена для считывания из потока, который задается 4-ым аргументом, неразделяемой последовательности из count(3-ий аргумент) элементов (размер одного элемента задает 2-ой аргумент) в буфер, адрес которого задается 1-ым аргументом (память под буфер должна быть выделена до вызова функции). Возвращает количество полностью прочитанных элементов, которое может быть меньше желаемого.   Предназначена для записи в поток, который задается 4-ым аргументом, неразделяемой последовательности из count(3-ий аргумент) элементов (размер одного элемента задает 2-ой аргумент) из буфера, адрес которого задается 1-ым аргументом (память под буфер должна быть выделена до вызова функции). Возвращает количество полностью записанных элементов, которое может быть меньше желаемого.   Считывает символ из потока (1-ый аргумент). Возвращает ASCII код считанного символа или EOF в случае ошибки или достижения конца файла.   Считывает строку из потока (3-ий аргумент) в буфер (1-ый аргумент), память под который должна быть выделена до вызова функции, при этом длина строки (с учетом конечного символа с кодом 0) не должна превышать n (2-ой аргумент). Считывание символов строки завершается, когда достигнут конец файла или строки (символы перевода курсора на новую строку при этом помещаются в буфер) или прочитано n-1 символов.   Записывает символ (1-ый аргумент) в поток (2-ой аргумент). Возвращает ASCII код записанного символа или EOF в случае ошибки.     Записывает строку (1-ый аргумент указывает на буфер ее содержащий) в поток (2-ой аргумент). Возвращает неотрицательное значение в случае успешного вывода или EOF - в случае ошибки.   Проверяет достижение конца потока (1-ый аргумент). Если конец потока не достигнут - возвращает не 0, в противном случае - 0.     Если в связанный с потоком файл (1-ый аргумент) производилась запись, то сбрасывает содержимое буфера на диск. Если из связанного с потоком файла производилось чтение, то очищает буфер. Применяется только к буферизированным потокам. В случае удачного завершения возвращает 0, в противном случае - EOF. fflush (NULL)- сбрасывает на диск буфера всех связанных с потоками файлов, в которые производилась запись.   Подобна функции fflush, но при этом срабатывает для всех открытых потоков.     Предназначена для изменения размеров (4-ый аргумент) буфера (указатель на него - 2-ой аргумент) для указанного потока (1-ый аргумент). 3-ий аргумент задает включение (значение _IOFBF) или выключение (значение _IONBF, при этом 2-ой и 4-ый аргументы игнорируются). Размер буфера может быть от 2 до 2147483647 байт.
Функции для ввода / вывода с использованием дескриптора файла. int _read ( int fd, void *buffer, unsigned int count, ); int _write ( int fd, const void *buffer, unsigned int count, ); int _eof( int fd ); Для их использования необходимо подключить файл io.h.     Предназначена для считывания из файла, дескриптор которого задается 1-ым аргументом, неразделяемой последовательности из count(2-ой аргумент) байт в буфер, адрес которого задается 2-ым аргументом (память под буфер должна быть выделена до вызова функции). Возвращает количество прочитанных байт, которое может быть меньше желаемого. При попытке чтения после достижения конца файла или в случае, когда 2-ой аргумент NULL функция возвращает -1.   Предназначена для записи в файл, дескриптор которого задается 1-ым аргументом, неразделяемой последовательности из count(2-ой аргумент) байт из буфера, адрес которого задается 2-ым аргументом (память под буфер должна быть выделена до вызова функции). Возвращает количество записанных байт, которое может быть меньше желаемого. В случае возникновения ошибки функция возвращает -1.   Проверяет достижение конца файла (его дескриптор - 1-ый аргумент). Если конец файла не достигнут - возвращает 1, в противном случае - 0. В случае ошибки - возвращает -1.
Навигационные функции при работе с потоками. void rewind ( FILE *stream ); int fgetpos ( FILE *stream, fpos_t *pos ); int fsetpos ( FILE *stream, const fpos_t *pos ); int ftell ( FILE *stream ); int fseek ( FILE *stream, long offset, int origin ); Позволяют получать / изменять указатель на текущее положение в потоке.     Позиционирует указатель на текущее положение в потоке (1-ый аргумент) в начало файла, связанного с потоком.     Для файла, связанного с потоком (1-ый аргумент) возвращает целочисленное значение, соответствующее позиции указателя на текущее положение в потоке (2-ой аргумент). Если функция выполнена успешно, то она возвращает 0, в противном случае - не 0. Используется в паре с fsetpos.   Для файла, связанного с потоком (1-ый аргумент) изменяет позицию указателя на текущее положение в потоке на значение 2-ого аргумента. Если функция выполнена успешно, то она возвращает 0, в противном случае - не 0.   Для файла, связанного с потоком (1-ый аргумент) возвращает целочисленное значение, соответствующее позиции указателя на текущее положение в потоке. В случае возникновения ошибки возвращает -1. Следует отметить, что функция ftell может неверно определить указатель на текущее положение в потоке, если файл открыт в текстовом режиме из-за интерпретации 2-ух символов с кодами 13 и 10 как одного. Для файлов, открытых в режиме добавления данных в конец, функция вернет позицию, для последней операции ввода/вывода, при этом для чтения и для записи эти позиции могут быть разными. Используется в паре с fseek.   Для файла, связанного с потоком (1-ый аргумент) изменяет позицию указателя на текущее положение в потоке на значение 2-ого аргумента. 3-ий аргумент задает начало отсчета: SEEK_CUR - от текущего положения; SEEK_END - от конца файла; SEEK_SET - от начала файла. Если функция выполнена успешно, то она возвращает 0, в противном случае - не 0.
Навигационные функции при работе с файлами через их дескрипторы. long _tell ( int handle ); long _lseek ( int fd, long offset, int origin ); //------------------------------ int _chsize ( int fd, long offset ); int _filelength ( int fd ); Позволяют получать / изменять указатель на текущее положение в файле.   Работает аналогично ftell, но файл задается своим дескриптором.     Работает аналогично fseek, но файл задается своим дескриптором. Возвращает новую позицию или -1 в случае ошибки.   //-------------------------------------------------------------------------- Дополнительные функции для работы с файлами, заданными через свои дескрипторы.   Изменяет размер файла, указанного своим дескриптором (1-ый аргумент) на размер, указанный 2-ым аргументом. Если функция выполнена успешно, то возвращает значение 0, иначе возвращает -1.     Возвращает размер файла в байтах, указанного своим дескриптором (1-ый аргумент). В случае ошибки возвращает -1.
2 b) Закрытие файла.   При работе с потоками. int flcose ( FILE *stream ); int _fcloseall () При работе с файлами через их дескрипторы. int _close ( int fd ); Этот шаг особенно важен при записи данных в файл, т.к. если файл не закрыть, то последняя порция данных (содержимое буфера) может быть потеряна.     Закрывает поток, а, соответственно, и файл, связанный с потоком. Если функция выполнена успешно, то возвращает значение 0, иначе - EOF.   Закрывает все открытые потоки (кроме stdin, stdout, stderr), а, соответственно, и файлы, связанные с потоками. Если функция выполнена успешно, то возвращает значение 0, иначе - EOF.     Закрывает файл, указанный дескриптором (1-ый аргумент). Если функция выполнена успешно, то возвращает значение 0, иначе возвращает -1.

 

Пример 1. Написать программу, которая заданный файл (задается с помощью командной строки или вводится с клавиатуры) разбивает на указанное количество фрагментов (задается с помощью командной строки или вводится с клавиатуры). При написании этой программы будет использоваться работа с файлами через дескрипторы.

#include <stdio.h>

#include <io.h>

#include <fcntl.h>

#include <string.h>

#include <sys/stat.h>

#include <stdlib.h>

typedef unsigned int UINT;

#define MAX_NAME 255

/*




Поделиться с друзьями:


Дата добавления: 2017-01-14; Просмотров: 642; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.018 сек.