Функции ввода-вывода данных файла
1) Символьный ввод-вывод
Для символьного ввода-вывода используются функции:
int fgetc(FILE *fp);
где fp – указатель на поток, из которого выполняется считывание.
Функция возвращает очередной символ в формате int из потока fp. Если символ не может быть прочитан, то возвращается значение EOF.
int fputc(int c, FILE*fp);
где fp – указатель на поток, в который выполняется запись;
c – переменная типа int, в которой содержится записываемый в поток символ.
Функция возвращает записанный в поток fp символ в формате int. Если символ не может быть записан, то возвращается значение EOF.
Пример 2.
#include <stdio.h>
void main() {
FILE *f;
char c;
char *filename="t.txt";
if ((f=fopen(filename,"r"))==0)
perror(filename);
while (c=fgetc(f)!=EOF)
putchar(c);// вывод с на стандартное устройство вывода
fclose(f);
}
2) Строковый ввод-вывод
Для построчного ввода-вывода используются следующие функции:
char *fgets(char *s, int n, FILE *f);
где char *s – адрес, по которому размещаются считанные байты;
int n – количество считанных байтов;
FILE *f – указатель на файл, из которого производится считывание.
Прием байтов заканчивается после передачи n-1 байтов или при получении управляющего символа '\n'. Управляющий символ тоже передается в принимающую строку. Строка в любом случае заканчивается '\0'. При успешном завершении считывания функция возвращает указатель на прочитанную строку, при неуспешном – 0.
int fputs(char *s, FILE *f);
где char *s – адрес, из которого берутся записываемые в файл байты;
FILE *f – указатель на файл, в который производится запись.
Символ конца строки ('\0') в файл не записывается. Функция возвращает EOF, если при записи в файл произошла ошибка, при успешной записи возвращает неотрицательное число.
Пример 3. Построчное копирование данных из файла f1.txt в файл f2.txt.
#include <stdio.h>
#define MAXLINE 255 //максимальная длина строки
void main() {
//копирование файла in в файл out
FILE *in, //исходный файл
*out; //принимающий файл
char buf[MAXLINE];
//строка, с помощью которой выполняется копирование
in=fopen("f1.txt","r");
//открыть исходный файл для чтения
out=fopen("f2.txt","w");
//открыть принимающий файл для записи
while(fgets(buf, MAXLINE, in)!=0)
//прочитать байты из файла in в строку buf
fputs(buf, out);
//записать байты из строки buf в файл out
fclose(in); //закрыть исходный файл
fclose(out);//закрыть принимающий файл
}
3) Блоковый ввод-вывод
Для блокового ввода-вывода используются функции:
int fread(void *ptr, int size, int n, FILE *f);
где void *ptr – указатель на область памяти, в которой размещаются считанные из файла данные;
int size – размер одного считываемого элемента;
int n – количество считываемых элементов;
FILE *f – указатель на файл, из которого производится считывание.
В случае успешного считывания функция возвращает количество считанных элементов, иначе – EOF.
int fwrite(void *ptr ,int size, int n, FILE *f);
где void *ptr – указатель на область памяти, в которой размещаются считанные из файла данные;
int size – размер одного записываемого элемента;
int n – количество записываемых элементов;
FILE *f – указатель на файл, в который производится запись.
В случае успешной записи функция возвращает количество записанных элементов, иначе – EOF.
Пример 4.
#include <stdio.h>
struct Employee {char name[30];
char title[30];
float rate;
};
void main(){
Employee e;
FILE *f;
if((f=fopen("text.dat","w"))==NULL) {
printf("\nФайл не открыт для записи");
}
int n;
//запись в файл
printf("\nВведите количество записей N=");
scanf("%d",&n);
for(int i=0;i<n;i++) {
//формируем структуру е
printf("имя:");scanf("%s",&e.name);
printf("наименование:");scanf("%s",&e.title);
printf("налог:");scanf("%f",&e.rate);
//записываем переменную е в файл
fwrite(&e,sizeof(Employee),1,f);
}
fclose(f);
//чтение из файла
if((f=fopen("f.dat","rb"))==NULL)
printf("\nФайл не открыт для чтения");
while(fread(&e,sizeof(Employee),1,f))
printf("%s, %s, %f;\n", e.name, e.title, e.rate);
fclose(f);
}
4) Форматированный ввод-вывод
В некоторых случаях информацию удобно записывать в файл без преобразования, т.е. в символьном виде, пригодном для непосредственного отображения на экран. Для этого можно использовать функции форматированного ввода-вывода:
int fprintf(FILE *f, const char *fmt, ...);
где FILE*f – указатель на файл, в который производится запись;
const char *fmt – форматная строка;
... – список переменных, которые записываются в файл.
Функция возвращает число записанных символов.
int fscanf(FILE *f, const char *fmt, par1, par2, ...);
где FILE*f – указатель на файл, из которого производится чтение;
const char *fmt – форматная строка;
par1, par2, ... – список переменных, в которые заносится информация из файла.
Функция возвращает число переменных, которым присвоено значение.
Пример 5.
#include<stdio.h>
void main() {
FILE *f;
int n, nn,m;
if((f=fopen("int.dat","w"))==0)
perror("int.txt");
for(n=1;n<11;n++)
fprintf(f, "\n%d %d", n, n*n);
fclose(f);
if ((f=fopen("int.dat","r"))==0)
perror("int.txt");
m=1;
while(fscanf(f, "%d %d",&n, &nn)&& m++<11)
printf("\n%d %d",n,nn);
fclose(f);
}
Дата добавления: 2015-02-16; просмотров: 765;