Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа 2new.rtf
Скачиваний:
6
Добавлен:
09.11.2019
Размер:
620.69 Кб
Скачать

Закрытие файла – fclose

Функция закрывает файл после окончания ввода-вывода.

int fclose(FILE *fileid);

Закрывает указанный fileid файл ввода-вывода. Перед закрытием сбрасываются все буфера, связанные с этим файлом. Буфера, распределенные системой, освобождаются. Буфера, назначенные setbuf и setvbuf, автоматически не освобождаются. (Однако если setvbuf получил NULL в качестве указателя на буфер, при закрытии он будет освобожден).

Возвращается 0 при успешном завершении и EOF при любой обнаруженной ошибке.

Пример:

#include <string.h>

#include <stdio.h>

int main(void)

{ FILE *fp;

char buf[11] = "0123456789";

/* создает файл длиной 10 байт */

fp = fopen("DUMMY.FIL", "w");

if (fp) {

fwrite(&buf, strlen(buf), 1, fp); /* закрывает файл */

fclose(fp);

}

else {

printf("Unable to open file!\n");

}

return 0;

}

Перемещение позиции ввода/вывода – fseek

Функция перемещает указатель вводв/вывода в файле ввода-вывода.

int fseek(FILE *fileid, long offset, int whence);

Устанавливает указатель чтения/записи в буфере файла, связанного с идентификатором fileid в новую позицию (offset байтов от позиции, заданной whence). Для файлов в текстовом режиме offset может быть 0 или значением, возвращаемым ftell. whence должно быть равно 0, 1 или 2; эти значения представлены тремя символическими константами, определенными в stdio.h:

whence

Положение в файле

SEEK_SET (0)

Начало файла

SEEK_CUR (1)

Текущая позиция

SEEK_END (2)

Конец файла

fseek игнорирует любой символ, вставленный с помощью ungetc.

fseek используется с файловым вводом-выводом; для ввода-вывода через обработчик файла используйте lseek.

Следующей после fseek операцией обработки файла может быть либо ввод либо вывод.

При успешном перемещении указателя возвращается 0; при ошибке - ненулевое значение.

!!! fseek может вернуть 0, указывая на успешное перемещение, хотя в действительности это не так. Это происходит потому, что DOS, которая фактически устанавливает указатель, не проверяет результат установки. fseek возвращает код ошибки, только если файл не открыт, или устройство не готово.

Пример:

#include <stdio.h>

long filesize(FILE *stream);

int main(void)

{ FILE *stream;

stream = fopen("MYFILE.TXT", "w+");

fprintf(stream, "This is a test");

printf("Filesize of MYFILE.TXT is %ld bytes\n", filesize(stream));

return 0;

}

long filesize(FILE *stream)

{ long curpos, length;

/* сохраняет текущую позицию файла */

curpos = ftell(stream);

/* ищет конец файла */

fseek(stream, 0L, SEEK_END);

/* получает текущее смещение в файле */

length = ftell(stream);

/* восстанавливает сохраненную позицию */

fseek(stream, curpos, SEEK_SET);

return length;

}

Запись символа / строки в файл – fputc / fputs

Функция выводит символ / строку в файл ввода-вывода.

int fputc(int c, FILE *fileid);

int fputs(const char *s, FILE *fileid);

Выводит символ c или строку s (символ конца строки при этом не добавляется, и завершающий нуль-символ не копируется) в указанный файл fileid.

В случае успешного завершения возвращается c или последний записанный символ (для fputs); при ошибке возвращается EOF.

Пример:

#include <stdio.h>

int main(void)

{ char msg[] = "Hello world";

int i = 0;

while (msg[i]) {

fputc(msg[i], stdout);

i++;

}

/*повторный вывод сообщения*/

fputs (msg, stdout);

return 0;

}