Лысаков. Основы программирования (1247269), страница 10
Текст из файла (страница 10)
Таким образом, мы пришли к одному важному принципу,относящемуся к системе ввода/вывода языка С: все потоки одинаковы, афайлы — нет.Если файл может поддерживать запросы на местоположение (указательтекущей позиции), то при открытии такого файла указатель текущейпозиции в файле устанавливается в начало. При чтении из файла (илизаписивнего)каждогосимволауказательтекущейпозицииувеличивается, обеспечивая тем самым продвижение по файлу.Файл отсоединяется от определенного потока (т.е. разрывается связьмежду файлом и потоком) с помощью операции закрытия. При закрытиифайла, открытого с целью вывода, содержимое (если оно есть) связанного84www.phys.nsu.ruс ним потока записывается на внешнее устройство. Этот процесс, которыйобычноназываютдозаписьюпотока,гарантирует,чтоникакаяЧасто используемые функции файловой системы Сfopen()Открывает файлзавершает работу нормально, т.е.
либо main() возвращает управлениеfclose()Закрывает файлоперационной системе, либо вызывается exit(), то все файлы закрываютсяputc()Записывает символ в файлавтоматически. В случае аварийного завершения работы программы,fputc()To же, что и putc()getc()Читает символ из файлаУ каждого потока, связанного с файлом, имеется управляющаяfgetc()To же, что и getc()структура, содержащая информацию о файле; она имеет тип FILE. В этомfgets()Читает строку из файлаfputs()Записывает строку в файлfseek()Устанавливает указатель позиции на определенный байтпомнить, что основная цель такого разграничения — это обеспечитьftell()Возвращает текущее значение указателя в файлеединый интерфейс.
Для выполнения всех операций ввода/вывода следуетfprintf()Для файла то же, что printf() для консолиfscanf()Для файла то же, что scanf() для консолиfeof()Возвращает значение true, если достигнут конец файлаferror()Возвращает значение true, если произошла ошибкаrewind()Устанавливает указатель позиции в начало файлаremove()Стирает файлfflush()Дозапись потока в файлинформация случайно не останется в буфере диска. Если программанапример, в случае краха или завершения путем вызова abort(), файлы незакрываются.блоке управления файлом никогда ничего не меняйте.Если вы новичок в программировании, то разграничение потоков ифайлов может показаться излишним или даже "заумным".
Однако надоиспользовать только понятия потоков и применять всего лишь однуфайловую систему. Ввод или вывод от каждого устройства автоматическипреобразуется системой ввода/вывода в легко управляемый поток.Функции библиотеки ввода-вывода языка С, поддерживающие обменданными с файлами на уровне потока, позволяют обрабатывать данныеразличных размеров и форматов, обеспечивая при этом буферизованныйвводивывод.Такимобразом,поток—этофайлвместес предоставляемыми средствами буферизации.7.2.Основы файловой системыФайловая система языка С состоит из нескольких взаимосвязанныхфункций. Самые распространенные из них показаны в ниже таблице. Дляих работы требуется заголовок <stdio.h>.Заголовок <stdio.h> предоставляет прототипы функций ввода/вывода иопределяет следующие три типа: size_t, fpos_t и FILE. size_t и fpos_tпредставляют собой определенные разновидности такого типа, как целоебез знака.
А о третьем типе, FILE, рассказывается в следующем разделе.Кроме того, в <stdio.h> определяется несколько макросов. Из них кматериалу этой главы относятся NULL, EOF, FOPEN_MAX, SEEK_SET,8586www.phys.nsu.ruSEEK_CUR и SEEK_END. Макрос NULL определяет пустой (null)где имя_файла — это указатель на строку символов, представляющуюуказатель. Макрос EOF, часто определяемый как -1, является значением,собой допустимое имя файла, в которое также может входитьвозвращаемым тогда, когда функция ввода пытается выполнить чтениеспецификация пути к этому файлу. Строка, на которую указывает режим,после конца файла.
FOPEN_MAX определяет целое значение, равноеопределяет, каким образом файл будет открыт. Ниже в таблице показано,максимальному числу одновременно открытых файлов. Другие макросыкакие значения строки режим являются допустимыми. Строки, подобныеиспользуются вместе с fseek() — функцией, выполняющей операции"r+b" могут быть представлены и в виде "rb+".прямого доступа к файлу.Допустимые значения режимУказатель файла7.3.rОткрыть текстовый файл для чтенияввода/вывода языка С. Указатель файла — это указатель на структуру типаwСоздать текстовый файл для записиFILE.
Он указывает на структуру, содержащую различные сведения оaДобавить в конец текстового файлафайле, например, его имя, статус и указатель текущей позиции в началоrbОткрыть двоичный файл для чтенияwbСоздать двоичный файл для записиввода/вывода. Чтобы выполнять в файлах операции чтения и записи,abДобавить в конец двоичного файлапрограммы должны использовать указатели соответствующих файлов.r+Открыть текстовый файл для чтения/записиw+Создать текстовый файл для чтения/записиУказатель файла — это то, что соединяет в единое целое всю системуфайла. В сущности, указатель файла определяет конкретный файл ииспользуется соответствующим потоком при выполнении функцийЧтобы объявить переменную-указатель файла, используйте такого родаоператор:FILE *fp;a+Открытие файла7.4.Функция fopen() открывает поток и связывает с этим потокомопределенный файл.
Затем она возвращает указатель этого файла. Чащевсего(атакжевоставшейсячастиэтойглавы)подфайломподразумевается дисковый файл. Прототип функции fopen() следующий:FILE *fopen(const char *имя_файла, const char *режим);Добавить в конец текстового файла или создать текстовыйфайл для чтения/записиr+bОткрыть двоичный файл для чтения/записиw+bСоздать двоичный файл для чтения/записиa+bДобавить в конец двоичного файла или создать двоичныйфайл для чтения/записиКак уже упоминалось, функция fopen() возвращает указатель файла.Никогда не следует изменять значение этого указателя в программе.
Еслипри открытии файла происходит ошибка, то fopen() возвращает пустой(null) указатель.8788www.phys.nsu.ruВ следующем коде функция fopen() используется для открытия файларежиме w+ все произойдет наоборот: файл будет создан! Более того, еслифайл уже существует, то открытие его в режиме w+ приведет к утрате егопо имени TEST для записи.содержимого, а в режиме r+ оно останется нетронутым.FILE *fp;fp = fopen("test", "w");Хотя предыдущий код технически правильный, но его обычно пишутнемного по-другому:FILE *fp;Из таблицы видно, что файл можно открыть либо в одном изтекстовых, либо в одном из двоичных режимов. В большинствереализаций в текстовых режимах каждая комбинация кодов возвратакаретки (ASCII 13) и конца строки (ASCII 10) преобразуется при вводе всимвол новой строки.
При выводе же происходит обратный процесс:if ((fp = fopen("test","w"))==NULL)printf("Ошибка при открытии файла.\n");символы новой строки преобразуются в комбинацию кодов возвратакаретки (ASCII 13) и конца строки (ASCII 10). В двоичных режимах такиепреобразования не выполняются.Этот метод помогает при открытии файла обнаружить любую ошибку,Максимальное число одновременно открытых файлов определяетсянапример, защиту от записи или полный диск, причем обнаружить еще доFOPEN_MAX. Это значение не меньше 8, но чему оно точно равняется –того, как программа попытается в этот файл что-либо записать. Вообщеэто должно быть написано в документации по компилятору.говоря, всегда нужно вначале получить подтверждение, что функция -fopen() выполнилась успешно, и лишь затем выполнять с файлом другиеоперации.7.5.Закрытие файлаХотя название большинства файловых режимов объясняет их смысл,Функция fclose() закрывает поток, который был открыт с помощьюоднако не помешает сделать некоторые дополнения.
Если попытатьсявызова fopen().Функция fclose() записывает в файл все данные, которыеоткрыть файл только для чтения, а он не существует, то работа fopen()еще оставались в дисковом буфере, и проводит, так сказать, официальноезавершится отказом. А если попытаться открыть файл в режиме дозаписи,закрытие файла на уровне операционной системы. Отказ при закрытииа сам этот файл не существует, то он просто будет создан.