Skip to content

4 文件的读写

文件的打开与关闭

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

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

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

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

C
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 指向文件

C
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)

解释同上

C
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 但多一个文件地址

C
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 但多一个文件地址

C
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 等读写 简而言之,打开方式与读写函数方式应匹配