- •Оператор перехода
- •Оператор return
- •Оператор goto
- •Оператор break
- •Функция exit()
- •Оператор continue
- •Сортировка массива
- •Сортировка массива выбором
- •Сортировка методом пузырька
- •Линейный поиск в массивах
- •Бинарный поиск в массивах
- •Файловый ввод/вывод в языке Си
- •[Править]Открытие файла при помощи fopen
- •[Править]Закрытие потока при помощи fclose
- •[Править]Чтение из потока [править]при помощи fgetc
- •[Править]«Ловушка» eof
- •[Править]при помощи fgets
- •[Править]fwrite
- •[Править]Запись в файл при помощи fwrite
- •[Править]Запись в поток при помощи fputc
- •[Править]Пример использования
- •Первое знакомство с перегрузкой функций
- •Когда необходима перегрузка
- •Что вам необходимо знать
- •Рекурсия
Файловый ввод/вывод в языке Си
[править]
Материал из Википедии — свободной энциклопедии
Текущая версия страницы пока не проверялась опытными участниками и может значительно отличаться от версии, проверенной 13 сентября 2010; проверки требуют 9 правок.
Язык программирования Си поддерживает множество функций стандартных библиотек для файлового ввода и вывода. Эти функции составляют основу заголовочного файла стандартной библиотеки языка Си <stdio.h>.
Функциональность ввода-вывода языка Си по текущим стандартам реализуется на низком уровне. Язык Си абстрагирует все файловые операции, превращая их в операции с потоками байтов, которые могут быть как «потоками ввода», так и «потоками вывода». В отличие от некоторых ранних языков программирования, язык Си не имеет прямой поддержки произвольного доступа к файлам данных; чтобы считать записанную информацию в середине файла, программисту приходится создавать поток,ищущий в середине файла, а затем последовательно считывать байты из потока.
Потоковая модель файлового ввода-вывода была популяризирована во многом благодаря операционной системе Unix, написанной на языке Си. Большая функциональность современных операционных систем унаследовала потоки от Unix, а многие языки семейства языков программирования Си унаследовали интерфейс файлового ввода-вывода языка Си с небольшими отличиями (например, PHP). Стандартная библиотека C++ отражает потоковую концепцию в своем синтаксисе (смотриiostream).
Содержание [показать] |
[Править]Открытие файла при помощи fopen
Файл открывается при помощи fopen, которая возвращает информацию потока ввода-вывода, прикрепленного к указанному файлу или другому устройству, с которого идет чтение (или в который идет запись). В случае неудачи функция возвращает нулевой указатель.
Схожая функция freopen библиотеки Си выполняет аналогичную операцию после первого закрытия любого открытого потока, связанного с ее параметрами.
Они определяются как
FILE *fopen(const char *path, const char *mode);
FILE *freopen(const char *path, const char *mode, FILE *fp);
Функция fopen по сути представляет собой «обертку» более высокого уровня системного вызова open операционной системы Unix. Аналогично, fclose является оберткой системного вызова Unix close, а сама структура FILE языка Си зачастую обращается к соответствующему файловому дескриптору Unix. В POSIX-окружении функция fdopen может использоваться для инициализации структуры FILE файловым дескриптором. Тем не менее, файловые дескрипторы как исключительно Unix-концепция не представлены в стандарте языка Си.
Параметр mode (режим) для fopen и freopen должен быть строковый и начинаться с одной из следующих последовательностей:
режим |
описание |
начинает с.. |
||||
r |
rb |
|
открывает для чтения |
начала |
||
w |
wb |
|
открывает для записи (создает файл в случае его отсутствия). Удаляет содержимое и перезаписывает файл. |
начала |
||
a |
ab |
|
открывает для добавления (создает файл в случае его отсутствия) |
конца |
||
r+ |
rb+ |
r+b |
открывает для чтения и записи |
начала |
||
w+ |
wb+ |
w+b |
открывает для чтения и записи. Удаляет содержимое и перезаписывает файл. |
начала |
||
a+ |
ab+ |
a+b |
открывает для чтения и записи (добавляет в случае существования файла) |
конца |
Значение «b» зарезервировано для двоичного режима С. Стандарт языка Си описывает два вида файлов — текстовые и двоичные — хотя операционная система не требует их различать (однако, для некоторых компиляторов, например LCC, указание 'b' при работе с бинарным файлом принципиально важно!). Текстовый файл — файл, содержащий текст, разбитый на строки при помощи некоторого разделяющего символа окончания строки или последовательности (в Unix — одиночный символ перевода строки; в Microsoft Windows за символом перевода строки следует знак возврата каретки). При считывании байтов из текстового файла, символы конца строки обычно связываются (заменяются) с переводом строки для упрощения обработки. При записи текстового файла одиночный символ перевода строки перед записью связывается (заменяется) с специфичной для ОС последовательностью символов конца строки. Двоичный файл — файл, из которого байты считываются и выводятся в «сыром» виде без какого-либо связывания (подстановки).
При открытом файле в режиме обновления ('+' в качестве второго или третьего символа аргумента обозначения режима) и ввод и вывод могут выполняться в одном потоке. Тем не менее, запись не может следовать за чтением без промежуточного вызова fflush или функции позиционирования в файле (fseek, fsetpos илиrewind), а чтение не может следовать за записью без промежуточного вызова функции позиционирования в файле. [1]
Режимы записи и добавления пытаются создать файл с заданным именем, если такого файла еще не существует. Как указывалось выше, если эта операция оканчивается неудачей, fopen возвращает NULL.