Для обслуживания потоков, определяющих файлы на дисках используются функции библиотеки языка С:
- чтение одного символа из файла:
int fgetc(FILE *stream);
int getc(FILE *stream);
- запись одного символа в файл:
int fputc(int c, FILE *stream);
int putc(int c, FILE *stream);
- форматированный вывод в файл:
int fprintf(FILE *stream, const char *format[, argument, ...]);
- форматированный ввод из файла:
int fscanf(FILE *stream, const char *format[, address, ...]);
- чтение строки из файла:
char *fgets(char *str, int n, FILE *stream);
- запись строки в файл:
int fputs(const char *str, FILE *stream);
- чтение из файла порции данных:
size_t fread(void *ptr, size_t size, size_t n, FILE *stream);
- запись в файл порции данных:
size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream);
Функция fputs записывает строку str в файл, заданный указателем stream на поток, и возвращает неотрицательное целое. При ошибках функция возвращает значение EOF. Символ конца строки - '\0' в файл не переносится, и символ '\n' в файл не записывается.
Функция fgets читает из определяемого указателем stream файла не более (n - 1) символов и записывает их в строку str. Функция прекращает чтение, как только прочтет (n - 1) символов или встретит символ новой строки '\n', который переносится в строку str. При ошибках или при достижении конца файла, при условии, что из файла не прочитан ни один символ, функция возвращает значение NULL. Следует особо отметить, что в отличие от функции строкового ввода из стандартного потока (gets()) данная функция не отбрасывает символ '\n'.
Функция fread() считывает из файла, определяемого указателем потока stream, в область памяти, определяемую указателем ptr n элементов размером по size байтов каждый. Функция возвращает число действительно прочитанных элементов. Если число элементов меньше заказанного (count), то это свидетельствует либо о достижении конца файла, либо об ошибке чтения. Чтобы проанализировать эту ситуацию можно воспользоваться функциями feof() или ferror(). Если файл открыт в текстовом режиме, то осуществляется замена символов конца строки ('\r\n' à '\n').
Функция fwrite() записывает n элементов, по size байтов каждый, из области памяти, задаваемой указателем ptr в поток stream. Функция возвращает число действительно записанных элементов. Если возвращаемое значение меньше заказанного (n) - то это свидетельствует о возникшей ошибке.
Позиционирование в потоке.
Выполнение всех обменных операций с потоком связано с понятием текущей позиции в потоке. Начальная позиция чтения-записи установливается при открытии потока и может соответствовать либо первому байту файла (для режимов "write" или "read"), либо конечному (за последним байтом) (для режима "append"). При выполнении операций ввода-вывода текущая позиция в потоке меняется в соответствии с количеством прочитанных или записанных байтов.
Программисту даются средства для управления позиционированием в потоках, связанных с файлами (но не потоков, связанных с устройствами! Например, стандартных).
Функция fseek() позволяет установить указатель текущей позиции в потоке на нужный байт. Прототип этой функции:
int fseek( FILE *stream, long offset, int origin );
здесь offset - смещение, может быть как отрицательным так и положительным, т.е. возможно изменение текущей позиции по файлу и вперед, и назад;
origin - начало отсчета - задается при помощи одной из предопределенных констант:
SEEK_SET () - начало файла (значение 0);
SEEK_CUR () - текущая позиция (значение 1);
SEEK_END ()- конец файла (значение 2).
Примеры:
fseek(fp,0L,SEEK_SET); // Перемещение к началу файла (из любой позиции)
fseek(fp,0L,SEEK_END); // Перемещение к концу файла (из любой позиции)
fseek(fp,-2L,SEEK_СUR); // Возврат на два байта от текущей позиции
fseek(fp,12L,SEEK_СUR); // Пропуск 12 байтов от текущей позиции
Для получения значения указателя текущей позиции в потоке служит функция
long ftell( FILE *stream);
Пример:
long pos;
FILE * fp;
...
pos = ftell(fp);//Запомнить текущую позицию
...
fseek(fp, pos, SEEK_SET);// Восстановить запомненное значение