
- •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);
Int fprintf(file *fp, char *format [,аргумент]…);
Эта функция выводит данные с преобразованием по заданному формату в открытый файл через поток fp. В случае успеха возвращает число выведенных байтов (символов), а в случае ошибки – EOF.
Пример 3.5
#include<stdio.h> |
int main() |
{FILE *fp=fopen("abc.txt","w"); |
if(fp==NULL){puts("ошибка открытия файла"); return -1;} |
int a=5; float b=3.56; long c=50000; |
fprintf(fp1,”%d %f %ld\n”,a,b,c); |
int arr[5]={1,2,3,4,5}; |
float mas[5]={1.1,2.2,3.3,4.4,5.5}; |
for(int i=0;i<5;i++) |
fprintf(fp,"%d %f\n",arr[i],mas[i]); |
if((fp=freopen("data.txt","r",fp))==NULL) |
int n; float f; long k; |
fscanf(fp,"%d %f %ld\n",&n,&f,&l); |
printf("%d %.2f %ld\n",n,f,k); |
int a[5]; float m[5]; |
for(int j=0;j<5;j++) |
{fscanf(fp,"%d %f\n",&a[j],&m[j]); |
printf("%d %.2f\n",a[j], m[j]);} |
fclose (fp); |
return 0;} |
|
Функция форматированного записи (вывода) в строку имеет прототип:
Int sprintf(char *buf, char *format [,аргумент]…);
Эта функция выводит данные с преобразованием по формату в строку buf. Последний символ устанавливается '\0'. В случае успеха возвращает число выведенных байтов (символов), а в случае ошибки – EOF.
Функция форматированного чтения (ввода) из строки имеет прототип:
Int sscanf(char *buf, char *format [,указатель]…);
Эта функция вводит из строки данные с преобразованием по заданному формату и помещает их в ячейки памяти, определяемые указателями. В случае успеха возвращает число обработанных при вводе полей или EOF(–1) в случае ошибки.
Пример 3.6
#include<stdio.h> |
int main() |
{int a1=10; long b1=50000; char buf1[20]; |
sprintf(buf1,"a1=%d, b1=%ld",a1,b1); |
puts(buf1); // |
float e, pi; |
char buf2[25]="2.718281, 3.141592"; |
sscanf(buf2,"%f, %f",&e,&pi); |
printf("e=%f pi=%f\n",e,pi); |
return 0;} |
|
Блок – это группа рядом расположенных байтов, между которыми нет никаких специальных разделителей. Для того чтобы не иметь проблем с символами '\n', '\0', блоковый ввод-вывод выполняют в бинарном режиме. За одно обращение можно переносить несколько блоков.
Функция блокового записи (вывода) в файл имеет прототип:
Int fwrite(void *ptr, int size, int n, file *fp);
Эта функция записывает через поток fp в открытый файл N блоков, размером size байт каждый, из области памяти, определяемой указателем ptr. В случае успеха возвращает число блоков, а в случае ошибки – EOF.
Функция блокового чтения (ввода) из файла имеет прототип:
Int fread(void *ptr,int size,int n,file *fp);
Эта функция считывает через поток fp из открытого файла N блоков, размером size байт каждый, в область памяти, определяемой указателем ptr. В случае успеха возвращает число блоков, а в случае ошибки или достижения конца файла – EOF.
Пример 3.7
#include<stdio.h> |
int main() |
{FILE *fp1=fopen("abc.txt","wb"); |
if(fp1==NULL){puts("ошибка открытия файла"); return -1;} |
struct REC{int a; float b[2];}; |
REC str1={1, 2.2, 3.3}; |
fwrite(&str1,sizeof(REC),1,fp1); |
REC str2[3]={{1, 1.2, 1.3},{2, 2.2, 2.3},{3, 3.2, 3.3}}; |
fwrite(str2,sizeof(REC),3,fp1); |
fclose(fp1); |
FILE *fp2=fopen("abc.txt","rb"); |
if(fp2==NULL){puts("ошибка открытия файла"); return -1;} |
REC str3, str4[3]; |
fread(&str3,sizeof(REC),1,fp2); |
printf("%d %.1f %.1f\n", str3.a, str3.b[0],str3.b[1]); |
fread(str4,sizeof(REC),3,fp2); |
for(int i=0;i<3;i++) |
{printf("%d ", str4[i].a); |
printf("%.1f %.1f\n", str4[i].b[0],str4[i].b[1]);} |
fclose(fp2); |
return 0;} |
|