Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Тема7.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
127.49 Кб
Скачать

2.3. Чтение из файла и запись в файл

Для обслуживания потоков, определяющих файлы на дисках используются функции библиотеки языка С:

- чтение одного символа из файла:

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) - то это свидетельствует о возникшей ошибке.

2.4. Позиционирование в потоке.

Выполнение всех обменных операций с потоком связано с понятием текущей позиции в потоке. Начальная позиция чтения-записи установливается при открытии потока и может соответствовать либо первому байту файла (для режимов "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); // Восстановить запомненное значение

...

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]