- •Программирование на языке c
- •Работа с файлами и строками на языке c
- •Основные теоретические сведения Оператор выбора – switch…case…default
- •Оператор безусловного перехода - goto
- •Функции языка c
- •Определение функции
- •Объявление функции
- •Вызов функции
- •Работа с файлами
- •Открытие файла – fopen
- •Закрытие файла – fclose
- •Перемещение позиции ввода/вывода – fseek
- •Запись символа / строки в файл – fputc / fputs
- •Чтение символа / строки из файла – fgetc / fgets
- •Форматированный вывод в файл – fprint
- •Форматный ввод из файла – fscanf
- •Функции стандартной библиотеки ввода/вывода – stdio.H
- •Функции работы со строками – string.H, mem.H, mbstring.H
- •Задание
- •Варианты задания
Закрытие файла – 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;
}