Бинарный поток - это последовательность непреобразованных байтов, представляющих собой некоторые промежуточные данные, которые обладают тем свойством, что если их записать, а затем прочесть той же системой ввода- вывода, то мы получим информацию, совпадающую с исходной.
Поток соединяется с файлом или устройством посредством его открытия , указанная связь разрывается путем закрытия потока. Открытие файла возвращает указатель на объект типа FILE , который содержит всю информацию, необходимую для управления этим потоком. Если не возникает двусмысленности, мы будем пользоваться терминами "файловый указатель" и "поток" как равнозначными.
Когда программа начинает работу, уже открыты три потока: stdin, stdoutи stderr.
B1.1. Операции над файлами
Ниже перечислены функции, оперирующие с файлами. Тип size_t- беззнаковый целочисленный тип, используемый для описания результата оператора sizeof.
FILE *fopen(const char *filename, const char *mode);
fopenоткрывает файл с заданным именем и возвращает поток или NULL, если попытка открытия оказалась неудачной. Режим mode допускает следующие значения:
"r" |
текстовый файл открывается для чтения (от read (англ.) - читать); |
"w" |
текстовый файл создается для записи; старое содержимое (если оно было) выбрасывается (от write (англ.) - писать); |
"а" |
текстовый файл открывается или создается для записи в конец файла (от append (англ.) - добавлять); |
"r+" |
текстовый файл открывается для исправления (т. е. для чтения и для записи); |
"w+" |
текстовый файл создается для исправления; старое содержимое (если оно было) выбрасывается; |
"a+" |
текстовый файл открывается или создается для исправления уже существующей информации и добавления новой в конец файла. |
Режим "исправления" позволяет читать и писать в один и тот же файл; при переходах от операций чтения к операциям записи и обратно должны осуществляться обращения к fflushили к функции позиционирования файла. Если указатель режима дополнить буквой b (например "rb" или "w+b"), то это будет означать, что файл бинарный. Ограничение на длину имени файла задано константой FILENAME_MAX. Константа FOPEN_MAX ограничивает число одновременно открытых файлов.
FILE *freopen(const char *filename, const char *mode, FILE *stream);
freopenоткрывает файл с указанным режимом и связывает его с потоком stream . Она возвращает stream или, в случае ошибки, NULL. Обычно freopen используется для замены файлов, связанных с stdin , stdout или stderr , другими файлами.
int fflush(FILE *stream);
Применяемая к потоку вывода функция fflushпроизводит дозапись всех оставшихся в буфере (еще не записанных) данных, для потока ввода эта функция не определена. Возвращает EOF в случае возникшей при записи ошибки или нуль в противном случае. Обращение вида fflush (NULL) выполняет указанные операции для всех потоков вывода.
int fclose(FILE *stream);
fсloseпроизводит дозапись еще не записанных буферизованных данных, сбрасывает несчитанный буферизованный ввод, освобождает все автоматически запрошенные буфера, после чего закрывает поток. Возвращает EOF в случае ошибки и нуль в противном случае.
int remove(const char *filename);
removeудаляет файл с указанным именем; последующая попытка открыть файл с этим именем вызовет ошибку. Возвращает ненулевое значение в случае неудачной попытки.
int rename(const char *oldname, const char *newname);
renameзаменяет имя файла; возвращает ненулевое значение в случае, если попытка изменить имя оказалась неудачной. Первый параметр задает старое имя, второй - новое.
FILE *tmpfile(void);
tmpfileсоздает временный файл с режимом доступа "wb+", который автоматически удаляется при его закрытии или обычном завершении программой своей работы. Эта функция возвращает поток или, если не смогла создать файл, NULL.
char *tmpnam(char s[L_tmpnam]);
tmpnam(NULL) создает строку, не совпадающую ни с одним из имен существующих файлов, и возвращает указатель на внутренний статический массив. tmpnam(s) запоминает строку в s и возвращает ее в качестве значения функции; длина s должна быть не менее L_tmpnam. При каждом вызове tmpnam генерируется новое имя; при этом гарантируется не более TMPMAX различных имен за один сеанс работы программы. Заметим, что tmpnam создает имя, а не файл.
int setvbuf(FILE *stream, char *buf, int mode, size_t size);
Читать дальше