Функции ввода-вывода, работающие с файлами
Пример
Работа с файлами данных
Для программиста открытый файл представляется как последовательность данных — считываемых данных или записываемых данных. При открытии файла с ним связывается поток. Выводимая информация записывается в поток; считываемая информация берется из потока. Когда поток открывается для ввода-вывода, он связывается со структурой типа FILE, которая определена в stdio.h. Структура содержит разнообразную информацию о файле.
При открытии файла с помощью функции /open возвращается указатель на структуру типа FILE, который можно использовать для последующих операций с файлом.
#include <stdio.h> | ||||
/^прототип | функции*/ | |||
/^находится | в | файле*/ | ||
/*stdio.h*/ | ||||
FILE | *fopen | (name, type); | ||
char | *name; | |||
char | *type; |
Функция /open открывает файл, имя которого задается аргументом пате, и связывает с ним поток для выполнения операций ввода-вывода данных. Параметр type — это указатель на строку символов, определяющих способ доступа к файлу. Возвращаемое значение функции — указатель на структуру типа FILE.
Значения аргумента type следующие:
• "г" — открыть файл для чтения (файл должен существовать);
• "w" — открыть пустой файл для записи; если файл существует, то его содержимое теряется;
• "а" — открыть файл для записи в конец (для добавления); файл создается, если он не существует;
• "г+" — открыть файл для чтения и записи (файл должен существовать);
• "w+" — открыть пустой файл для чтения и записи; если файл существует, то его содержимое теряется;
• "а+" — открыть файл для чтения и дополнения, если файл не существует, то он создаётся.
Возвращаемое значение функции /open:
1) указатель на открытый поток;
2) значение NULL, если обнаружена ошибка.
Пример.Открытие существующего файла для чтения
main()
{
FILE *f; /* f - указатель на открытый поток */
char *а, *Ь; /* а и b - указатели на строки */
cL= cL • CLcLTL }
b="r";
f=fopen(a, b);
/* или более простой вариант: */ /* f= fopen("a.dat", "r"); */
Пример
f= | fopen("a.dat" | II у, II | ) ; | ||
/* | Так лучше не | прогр | аммировать,* | / | |
/* | поскольку фун | кция | возвращает | NULL, | */ |
/* | если файл не | может | быть открыт | .*/ | |
/* | Лучше сделать | так: | */ | ||
if { | ; (if = fopen( | "a.dat","г")) != | NULL | ) | |
} else | |||||
printf("\пОшибка | открытия файла!") | г |
Функция /close закрывает поток или потоки, связанные с открытыми при помощи функции/ореи файлами. Закрываемый поток определяется аргументом/
#inc | lude | <stdio | .h> |
int | fclose(f); | ||
FILE | *f; |
Возвращаемое значение:
1) значение 0, если поток успешно закрыт;
2) EOF, если произошла ошибка.
fclose(f);
Функция feof определяет достигнут ли конец файла. Если конец достигнут, то операция чтения будет возвращать значение EOF до тех пор, пока поток не будет закрыт.
#include <stdio.h> int feof(f); FILE *f;
Возвращаемое значение:
1)0 — если конец файла не найден;
2) ненулевое значение, если достигнут конец файла.
1. Функция чтения символа из файла fgetc. Функция fgetc читает один символ из вводного потока/
#inc | lude | <stdio | .h> |
int | fgetc(f); | ||
FILE | *f; |
Возвращаемое значение:
1) код прочитанного символа;
2) EOF, если конец файла или ошибка.
2. Функция записи символа в файл fputc. Функция fputc записывает одиночный символ, имеющий код с, в поток / Это аналог функции putchar для работы с файлами.
#inc | lude | <stdio | .h> |
int | fputs(c,f); | ||
int | c; | ||
FILE | *f; |
Возвращаемое значение:
1) код записанного символа;
2) EOF, если встретился конец файла или произошла ошибка.
Пример.Посимвольное копирование файла
#include <stdio.h> | |
main () { FILE *in, *out; | |
int c; | |
if((in=fopen("in.dat","r"))! { if((out=fopen("out.dat", { while((c=fgetc(in)) | =NULL) |
"w"))!=NULL) | |
!=EOF) | |
fputc(c,out); |
fclose(out); fclose(in);
} else
printf("He могу открыть out.dat \n");
} else
printf("He могу открыть in.dat \n"); }
Функции fscanf и fprintf. Действия данных функций похоже на действия функций scan/ и printf, однако эти функции работают с файлами данных, и первый аргумент функций — это указатель на файл.
3. Функция fscanf читает данные из указанного потока /, выполняя форматные преобразования, и полученные значения записывает в переменные, адреса которых задаются параметрами argument.
#include <stdio.h> | ||
int fscanf(f, format | string [,argument. | .] ) ; |
FILE *f; | ||
char ^format string; |
4. Функция fprintf выполняет формальные преобразования данных и печатает последовательность символов и значений в выводной поток/
#include <stdio.h> | ||
int fprintf(f, format string[, | argument. | .] ) ; |
FILE *f; | ||
char ^format string; |
Пример.Дано два файла S.dat и Sl.dat. Необходимо считать число типа int из файла S.dat и записать его в файл Sl.dat.
main () г | ||||||
FILE *S, | *S1; | |||||
/* S — указатель | на | файл | S.dat */ | |||
/* SI - | указатель | на | файл | SI | .dat*/ | |
int age; | ||||||
S=fopen( | "S.dat", | и -р и | ) ; | |||
Sl=fopen | ("Sl.dat" | и | a") ; |
fscanf(S, "%d", &age); | ||
fclose (S); | ||
fprintf(SI,"Пете - %d лет \n", | age) ; | |
fclose (SI); | ||
} |
Функции /gets и /puts предназначены для ввода-вывода строк, они являются аналогами функций gets и puts для работы с файлами.
5. Функция чтения строки символов из файла/gets. Функция /gets читает строку из входного потока f и помещает её в строку, адрес которой задается значением параметра s. Символы читаются из потока до тех пор, пока не будет прочитан символ новой строки '\п', который включается в строку, или пока не наступит конец потока или не будет прочитано п-\ символов. Результат помещается в s и заканчивается нулевым символом '\0'. Функция возвращает адрес строки.
#incl | ude | <std | io. h> | |||
char | *fgets (s | , n, f) ; | ||||
char | *s; | |||||
int г | v; | |||||
FILE | *f; | |||||
/* | f - | указатель | на | файл | */ |
6. Функция записи строки символов в файл /puts. Функция /puts копирует строку s в поток f с текущей позиции. Завершающий нулевой символ не копируется.
#inc | lude | <stc | lio | h> |
int | fputs | 3 (S, | f) , | |
char | *s; | |||
FILE | *f; |