
- •3 Работа с файлами
- •3.1 Открытие и закрытие файлов
- •Void perror(const char *str);
- •3.2 Запись данных в файл и чтение данных из файла
- •Int fputc(int ch, file *fp);
- •Int fgetc(file *fp);
- •Int fputs(char*string, file *fp);
- •Int fprintf(file *fp, char *format [,аргумент]…);
- •Int sprintf(char *buf, char *format [,аргумент]…);
- •Int sscanf(char *buf, char *format [,указатель]…);
- •Int fwrite(void *ptr, int size, int n, file *fp);
- •Int fread(void *ptr,int size,int n,file *fp);
- •3.3 Произвольный доступ к файлу
- •Int fseek(file *fp, long offset, int from_where);
3 Работа с файлами
3.1 Открытие и закрытие файлов
С началом выполнения программы автоматически открываются стандартные потоки: стандартный ввод (с клавиатуры), стандартный вывод (на экран монитора), стандартный вывод сообщений об ошибках (на экран монитора). Все другие потоки для обмена данными между файлами нужно открыть явно. Когда поток открывается, он связывается со структурой типа FILE, содержащей всю информацию для работы с потоком.
Открытие файла выполняет функция с прототипом:
FILE *fopen(const char *filename, const char *mode);
Эта функция возвращает указатель на структуру типа FILE (FILE*), описывающую открытый поток. Если поток не удалось открыть, функция возвращает NULL-указатель.
char filename – указатель на строку, задающую спецификацию открытого файла, т.е.полный путь и имя файла. Если путь не задан, то выбирается текущий диск и директорий.
char mode ‑ указатель на строку, задающую режим открытия потока, может принимать следующие значения:
"r" – поток открывается только для чтения из существующего файла, "r+" – поток открывается для чтения из существующего и записи в существующий файл;
"w" – поток открывается только для записи в файл, "w+" – поток открывается для записи в файл и для чтения из файла. Если файла нет, он создается, если файл существует, его старое содержимое пропадает;
"a" – поток открывается для добавления данных в конец файла, "a+" – поток открывается для добавления данных в конец файла и для чтения из файла. Если файл не существует, он создается;
t – поток открывается в текстовом режиме, задается после r, w, a;
b – поток открывается в двоичном режиме, задается после r, w, a.
Закрытие файла выполняет функция функция с прототипом:
int fclose(FILE *fp);
Функция закрывает поток, на который указывает fp. При успешном закрытии потока функция возвращает 0, иначе – EOF(–1).
Для переоткрытия файла с другим режимом доступа существует функция со следующим прототипом:
FILE *freopen(const char *filename,const char*mode,FILE *fp);
Пример 3.1
#include<stdio.h> |
int main() |
{FILE *fp; |
char buff[100],*fname ="myfile.txt"; |
fp=fopen(fname,"r"); |
if(fp==NULL) {puts("ERROR_1"); return -1;} |
fgets(buff,50,fp); |
puts(buff); |
fp=freopen(fname,"a",fp); |
if(fp==NULL) {puts("ERROR_2"); return -1;} |
fputs("abcdef",fp); |
fclose(fp); |
return 0;} |
Для анализа ошибок можно использовать функцию c прототипом:
Void perror(const char *str);
Эта функция выводит на экран строку str вместе с системной ошибкой. Список системных ошибок определен в файле <stdlib.h>.
Пример 3.2
#include<stdio.h> |
int main() |
{FILE *ptr fopen("abc.doc","r"); |
if(ptr==NULL){perror("Не могу открыть файл: ");return -1;} |
char c=fgetc(ptr); |
fclose(ptr); |
return 0;} |