一,前言
孔子曰:“学而不思则惘,思而不学则殆。”现将所了解的C语言FILE相关操作·知识汇总如下,请多多指教!
二,基础知识
FILE结构
struct _iobuf { char *_ptr; // 文件输入的下一个位置 int _cnt; // 当前缓冲区位置 char *_base; // 文件起始位置 int _flag; // 文件标志 int _file; // 文件有效性验证 int _charbuf; // 当前缓冲区状况 int _bufsiz; // 缓冲区大小 char *_tmpfname; // 临时文件名 }; typedef struct _iobuf FILE; //别名FILE,可以直接用
FILE文件操作
一,操作文件
1.fopen函数
打开数据文件
fopen(_In_z_ char const* _FileName,_In_z_ char const* _Mode);
即fopen(需要打开文件的文件名,打开文件的方式)
需要打开文件的文件名:
需要和exe文件在同一目录下,或者写出相对路径或绝对路径
打开文件的方式:
1.“r” 以"读"的方式打开一个文本文件(只能读)。 2.“r+” 在"r"的基础下增加了"写"。 3.“rb” 以"读"的方式打开一个二进制文件(只能读)。 4.“rb+” 在"rb"的基础下增加了"写"。 5.“w” 以"写"的方式创建一个文本文件, 如果这个文件已经存在,就会覆盖原来的文件。 6.“w+” 在"w"的基础下增加了"读"。 7.“wb” 以"写"的方式创建一个二进制文件。 8.“wb+” 在"wb"的基础下增加了"读"。 9.“a” 以"尾部追加"的方式打开一个文本文件(只能写)。 10.“a+” 在"a"的基础下增加了"读"。 11.“ab” 以"尾部追加"的方式打开一个二进制文件(只能写)。 12.“ab+” 在"ab"的基础下增加了"读"。 2.fclose函数
在文件操作完成后需将文件关闭
fclose(_Inout_ FILE* _Stream);
即fclose(文件名)
二,读写文件
1.fgets函数
按规则读取文件 // 成功返回缓冲区指针,失败返回 NULL。 fgets( _Out_writes_z_(_MaxCount) char* _Buffer, //接收文件内容的缓冲区指针 _In_ int _MaxCount, //读取的字节数 _Inout_ FILE* _Stream //文件对象指针 );
示例:
拓展:可以以多少字节为一行读取
FILE* f = fopen("Hello.txt", "r"); char buf[2048]; while (fgets(buf, 2, f)) { //buf[2048]即每行不超过2048个字节,2表示每次只读2个字节,f为文件指针 cout << buf << endl; }
2.fputs函数
将字符串写入文件
// 成功返回非负值,失败返回 EOF(-1) fputs( _In_z_ char const* _Buffer,// 要写入的字符串 _Inout_ FILE* _Stream // 指向 FILE 对象的指针 );
示例:
FILE* f = fopen("Hello.txt", "r+");
fputs("what do you mean?",f);
3.fread函数
fread( _Out_writes_bytes_(_ElementSize * _ElementCount) void* _Buffer, //读取的数据存放的内存的指针 _In_ size_t _ElementSize, //每次读取的字节数 _In_ size_t _ElementCount, //读取次数 _Inout_ FILE* _Stream //要读取的文件的指针 );
4.fwrite函数
fwrite( _In_reads_bytes_(_ElementSize * _ElementCount) void const* _Buffer, //要输出数据的地址 _In_ size_t _ElementSize, //每次写入的字节数 _In_ size_t _ElementCount, //写入次数 _Inout_ FILE* _Stream //目标文件指针 );
示例:
typedef struct book { char name[20]; char author[20]; }; int main(){ book a; FILE* f; f = fopen("Hello.txt", "a"); fread(&a,sizeof(struct book), 1, f); cin >> a.name >> a.author; fwrite(&a, sizeof(struct book), 1, f); fclose(f); }
5.fprintf函数
fprintf( _Inout_ FILE* const _Stream, //文件指针 _In_z_ _Printf_format_string_ char const* const _Format, //要写入的字符串 ...)
6.fscanf函数
fscanf( _Inout_ FILE* const _Stream, //文件指针 _In_z_ _Scanf_format_string_ char const* const _Format, //读取字符串 ...)
示例:通过fprint,fscanf写书的入馆信息
//fprintf() 成功返回写入的字符的个数,失败则返回负数。 //fscanf() 返回参数列表中被成功赋值的参数个数。 #define _CRT_SECURE_NO_DEPRECATE //不声明可能会报错,无碍 #include<stdio.h> #include <stdlib.h> #define N 2 struct book{ char name[10]; int num; int year; } booka[N], bookb[N], *pa, *pb; int main(){ FILE *fp; int i; pa=booka; pb=bookb; if( (fp=fopen("D:\\Hello.txt","wt+")) == NULL ){ puts("Fail to open file!"); exit(0); } //从键盘读入数据,保存到booka printf("输入数据:书名,数量,入馆年份:\n"); for(i=0; i<N; i++,pa++){ scanf("%s %d %d", pa->name, &pa->num, &pa->year); } pa = booka; //将booka中的数据写入到文件 for(i=0; i<N; i++,pa++){ fprintf(fp,"%s %d %d\n", pa->name, pa->num, pa->year); } //重置文件指针 rewind(fp); //从文件中读取数据,保存到bookb for(i=0; i<N; i++,pb++){ fscanf(fp, "%s %d %d\n", pb->name, &pb->num, &pb->year); } pb=bookb; //将bookb中的数据输出到显示器 for(i=0; i<N; i++,pb++){ printf("%s %d %d\n", pb->name, pb->num, pb->year); } fclose(fp); return 0; }