【无标题】标准 I/O 中的一些函数,按功能分类说明其用法和特点
下面详细讲解标准 I/O 中的这些函数,按功能分类说明其用法和特点:
一、文件打开与关闭
1. fopen()
:打开文件
功能:打开指定文件并返回文件流指针(FILE*
),用于后续操作。
原型:
FILE *fopen(const char *filename, const char *mode);
参数:
filename
:文件名(含路径)mode
:打开模式(常用):"r"
:只读(文件必须存在)"w"
:只写(文件不存在则创建,存在则清空)"a"
:追加(在文件末尾写入,不存在则创建)"r+"
:读写(文件必须存在)"w+"
:读写(文件不存在则创建,存在则清空)
返回值:成功返回 FILE*
指针,失败返回 NULL
。
示例:
FILE *fp = fopen("test.txt", "r");
if (fp == NULL) {perror("打开文件失败");return 1;
}
2. fclose()
:关闭文件
功能:关闭已打开的文件流,释放资源并刷新缓冲区。
原型:
int fclose(FILE *stream);
返回值:成功返回 0
,失败返回 EOF
。
示例:
fclose(fp); // 关闭文件,必须在操作完成后调用
二、按数据块读写(二进制/文本通用)
1. fread()
:从文件读取数据块
功能:从文件流中读取指定大小和数量的数据块。
原型:
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
参数:
ptr
:存储读取数据的缓冲区size
:每个数据块的字节数nmemb
:要读取的数据块数量stream
:文件流指针
返回值:成功读取的实际数据块数量(小于 nmemb
可能表示到文件尾或出错)。
示例:读取 10 个 int
类型数据
int arr[10];
size_t n = fread(arr, sizeof(int), 10, fp);
printf("成功读取 %zu 个整数\n", n);
2. fwrite()
:向文件写入数据块
功能:向文件流中写入指定大小和数量的数据块。
原型:
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
参数:与 fread()
类似,ptr
为要写入的数据。
返回值:成功写入的实际数据块数量(小于 nmemb
表示出错)。
示例:写入 5 个 double
类型数据
double data[] = {1.1, 2.2, 3.3, 4.4, 5.5};
fwrite(data, sizeof(double), 5, fp);
三、格式化输入输出(文本专用)
1. 标准设备格式化 I/O
-
printf()
:向标准输出(屏幕)格式化输出printf("姓名:%s,年龄:%d\n", "张三", 20);
-
scanf()
:从标准输入(键盘)格式化输入int age; printf("请输入年龄:"); scanf("%d", &age); // 注意取地址符 &
2. 文件格式化 I/O
-
fprintf()
:向文件流格式化输出fprintf(fp, "成绩:%d,等级:%c\n", 90, 'A'); // 写入文件
-
fscanf()
:从文件流格式化输入int score; char grade; fscanf(fp, "%d %c", &score, &grade); // 从文件读取
特点:支持格式控制符(%d
、%s
、%f
等),适合文本文件的结构化读写。
四、按字符操作
1. fgetc()
:读取单个字符
功能:从文件流中读取一个字符(ASCII 码)。
原型:
int fgetc(FILE *stream);
返回值:成功返回字符的 ASCII 码(int
类型),失败或到文件尾返回 EOF
。
示例:逐个字符读取文件内容
int c; // 必须用 int 类型接收(避免与 EOF 混淆)
while ((c = fgetc(fp)) != EOF) {putchar(c); // 输出到屏幕
}
2. fputc()
:写入单个字符
功能:向文件流中写入一个字符。
原型:
int fputc(int c, FILE *stream);
参数:c
为要写入的字符(ASCII 码)。
返回值:成功返回写入的字符,失败返回 EOF
。
示例:向文件写入字符 ‘A’ 和换行符
fputc('A', fp);
fputc('\n', fp); // 写入换行
五、按行操作(文本专用)
1. fgets()
:读取一行字符串
功能:从文件流中读取一行字符(包含换行符 \n
)。
原型:
char *fgets(char *str, int size, FILE *stream);
参数:
str
:存储读取结果的缓冲区size
:最大读取长度(实际最多读size-1
个字符,预留\0
)stream
:文件流指针
返回值:成功返回 str
,失败或到文件尾返回 NULL
。
示例:逐行读取文件
char buf[1024];
while (fgets(buf, sizeof(buf), fp) != NULL) {printf("%s", buf); // 输出一行(含换行符)
}
2. fputs()
:写入一行字符串
功能:向文件流中写入一个字符串(不自动添加换行符)。
原型:
int fputs(const char *str, FILE *stream);
示例:向文件写入一行文本
fputs("Hello, World!", fp); // 无换行
fputs("这是新的一行\n", fp); // 手动添加换行
总结
类别 | 函数组 | 核心特点 |
---|---|---|
文件控制 | fopen() 、fclose() | 打开/关闭文件,获取文件流指针 |
数据块读写 | fread() 、fwrite() | 适合二进制文件,按固定大小块操作 |
格式化 I/O | printf /scanf 等 | 支持格式控制,适合文本的结构化读写 |
字符操作 | fgetc() 、fputc() | 逐个字符读写,灵活但效率较低 |
行操作 | fgets() 、fputs() | 按行读写文本,自动处理换行符 |
这些函数均属于标准 I/O 库,自带缓冲机制,使用时需注意:
- 操作完成后必须用
fclose()
关闭文件(自动刷新缓冲区) - 文本文件建议用格式化/行操作函数,二进制文件建议用
fread()
/fwrite()
- 错误处理:通过返回值(如
EOF
、NULL
)判断操作是否成功