一、文件操作的基本步骤
在C语言中操作文件,永远是三步:
c
1. 打开文件 → fopen()
2. 读写文件 → fputc() / fgetc() / fputs() / fgets() / fprintf() / fscanf() / fwrite() / fread()
3. 关闭文件 → fclose()
注意:打开的文件一定要记得关闭,否则可能造成资源泄露或数据丢失。
二、文件的两种类型
| 类型 | 特点 | 举例 |
|---|---|---|
| ASCII码文件(文本文件) | 每个字符都能在终端显示 | .c、.txt、.h |
| 二进制文件 | 存在不可显示的字符 | 图片、音视频、压缩包 |
三、fopen :打开文件
c
FILE *fopen(const char *pathname, const char *mode);
mode(打开方式):
| 模式 | 含义 | 文件不存在 | 文件存在 |
|---|---|---|---|
r |
只读 | 报错 | 只读打开 |
r+ |
读写 | 报错 | 读写打开 |
w |
只写 | 创建 | 清空后只写打开 |
w+ |
写读 | 创建 | 清空后写读打开 |
a |
追加只写 | 创建 | 追加只写打开 |
a+ |
追加读写 | 创建 | 追加读写打开 |
c
FILE *fp = fopen("test.txt", "r");
if (fp == NULL) {
perror("fopen");
return -1;
}
四、标准IO的缓存机制
标准IO是有缓存的,数据不会立即写入文件,而是先存在缓冲区里,满足条件时才真正写入。
| 缓存类型 | 大小 | 刷新条件 | 关联对象 |
|---|---|---|---|
| 全缓存 | 4K(4096字节) | 缓存区满、强制flush、程序结束/fclose | 普通文件 |
| 行缓存 | 1K(1024字节) | 缓存区满、遇到 \n、强制flush、程序结束/fclose |
终端(stdout) |
| 不缓存 | 0 | 立即刷新 | stderr |
五、单个字符读写
5.1 fputc:写入一个字符
c
int fputc(int c, FILE *stream);
功能:将一个字符写入到指定的流中。
参数 :c 是要写入的字符(用ASCII码值表示),stream 是文件流指针。
返回值 :成功返回写入字符的ASCII码值,失败返回 EOF(-1)。
c
FILE *fp = fopen("test.txt", "w");
fputc('A', fp); // 写入字符 A
fputc('\n', fp); // 写入换行
fclose(fp);
5.2 fgetc: 读取一个字符
c
int fgetc(FILE *stream);
功能:从指定的流中读取一个字符。
返回值 :成功返回读取到的字符的ASCII码值,失败或读到文件末尾返回 EOF(-1)。
c
FILE *fp = fopen("test.txt", "r");
int ch;
while ((ch = fgetc(fp)) != EOF) {
putchar(ch); // 逐个打印字符
}
fclose(fp);
六、其他读写函数
字符串读写:
-
fputs(str, fp):向文件写入字符串 -
fgets(buf, size, fp):从文件读取字符串(会保留换行符)
格式化读写:
-
fprintf(fp, "format", ...):格式化写入文件 -
fscanf(fp, "format", ...):从文件格式化读取
二进制读写:
-
fwrite(ptr, size, nmemb, fp):写入二进制数据 -
fread(ptr, size, nmemb, fp):读取二进制数据(打开方式要加b,如"rb"、"wb")
三个默认流:
-
stdin:标准输入流 -
stdout:标准输出流 -
stderr:标准错误流
printf 本质上是 fprintf(stdout, ...),scanf 本质上是 fscanf(stdin, ...)。
七、今日总结
今天学了标准IO,核心要点如下:
-
文件操作三步走:打开(fopen)→ 读写 → 关闭(fclose)
-
打开方式 :
r(读)、w(写)、a(追加),加+表示读写,加b表示二进制 -
缓存机制:全缓存(普通文件)、行缓存(终端)、不缓存(stderr)
-
字符读写:fputc 写入单个字符,fgetc 读取单个字符,配合循环可遍历整个文件
-
其他读写:字符串(fputs/fgets)、格式化(fprintf/fscanf)、二进制(fwrite/fread)
-
三个默认流:stdin、stdout、stderr
今日感悟:
文件操作和printf/scanf很像,理解起来基本不费力。打开文件时一定要进行错误检查,并且要在最后关闭文件,不然可能会造成数据丢失。