文件的读写

文件的打开与关闭#

1
2
FILE *fp;
fp=fopen("File name","Method");
Method 访问形式 说明
r 只读 只读不写,不存在则返回 NULL
w 只写 只写不读,若文件已存在则删去原有内容,否则新建
a 追加写 在文件尾部追加数据,若文件不存在则新建
r+ 读写 可读可写,不存在则返回 NULL
w+ 读写 可写可读,若文件已存在则删去原有内容,否则新建
a+ 读与追加写 可读,可在尾部追加写,若文件不存在则新建

默认在后面附加 t ,即以文本形式打开文件。

若在后面附加 b ,如 "rb", "wb", "r+b" 则以二进制打开

使用完文件后必须关闭,否则可能导致数据丢失。

1
int fclose(FILE *p);

文件的读写#

  • 字符读 char c; c=fgetc(fp);
  • 字符写 int fputc(int c, FILE *p);
  • 读字符串函数 fgets(内存区首地址, 读入字符数+1, fp); char c[20]; fgets(c, n, fp); 则从 fp 文件中读取 n-1 个字符存入 c
  • 写字符串函数 fputs(str, fp)fputs(c,fp) 则将字符串 c 写入 fp
  • 判断文件是否结束 feof() ,结束返回非0,否则返回0

数据块读写(适用于二进制文件)#

数据块读 fread()#

size_t fread(void *buffer, size_t size, size_t count,FILE *fp)

解释:

  • buffer 存放读入数据的内存首地址
  • size 字节数,常用 sizeof(data_type)
  • count 读入数据项个数
  • fp 指向文件

1
2
3
4
5
int x[4];
FILE *fp;
fp=fopen("test.bat","rb");
fread(x,sizeof(int),4,fp);
fclose(fp);

数据块写 fwrite()#

size_t fwrite(void *buffer, size_t size, size_t count,FILE *fp)

解释同上

1
2
3
4
5
int x[5]={1,2,3,4,5};
FILE *fp;
fp=fopen("test.bat","rb");
fread(x,sizeof(int),5,fp);
fclose(fp);

格式读写函数#

fscanf()#

类似 scanf 但多一个文件地址

1
2
3
4
5
6
7
int a,b;
FILE *fp;
if((fp=fopen("test.txt","r+"))==NULL){
exit(0);
}
fscanf(fp,"%d %d\n",&a,&b);
fclose(fp);

fprintf()#

类似 printf 但多一个文件地址

1
2
3
4
5
6
7
8
int a=1;
double b=2.33;
FILE *fp;
if((fp=fopen("test.txt","w+"))==NULL){
exit(0);
}
fprintf(fp,"%d %lf\n",&a,&b);
fclose(fp);

文件定位#

rewind()#

void rewind(FILE *fp)

无返回值,将读写指针移动到开头

fseek()#

void fseek(FILE *fp, long offset, int origin)

  • origin 移动文件指针的相对起始位置
    • SEEK_SET or 0 :文件首
    • SEEK_CUR or 1 :当前文件读写位置
    • SEEK_END or 2 :文件尾
  • offsetorigin 为起始点的指针偏移量,类型要求为长整型
    • fseek(fp,100L,SEEK_SET) 从文件首开始 指针向文件尾移动100字节

[!warning]

如果成功定位则返回0,否则返回非零,对于不能重定位的设备,返回值不确定

可将指针定位到文件之外,若定位到文件之外,则将清除文件结束符

若以追加方式打开文件,当前文件指针由上次I/O操作决定,若还未进行I/O操作,则指针在开头

Ctrl+Z 被作为文件结束符,fopen打开时将会删除该字符,否则会导致fseek()ftell() 的定位失常

ftell()#

返回当前文件读写位置(出错则返回 -IL )

long ftell(FILE *fp)

文件缓冲区清除#

fflush()#

int fflush(FILE *fp)

可用于文件缓冲区清除,也可以用于标准输入输出缓冲区清除

why?

文件输入输出要现在缓冲区存放才会写入文件,清除缓冲区的目的是让缓冲区数据写入磁盘文件中

其他#

feek() rewind() fclose() 也具备清除缓冲区的功能

指针错误状态清除#

为什么会出现这种情况?

由于读写等操作失败引起文件输入输出缓冲区错误

clearerr()#

void clearerr(FILE *fp)

其他#

建议 clearerrfflush 配对使用

[!warning]

以二进制打开文件仅可用 freadfwrite 读写

用文本方式打开的文件不应用 freadfwrite 读写,而应用 fputc, fgetc, fgets, fputs, fscanf, fprintf 等读写

简而言之,打开方式与读写函数方式应匹配