文本读写
文本读写是文件操作的基础。fgetc/fputc 读写单个字符,fgets/fputs 读写字符串,fread/fwrite 读写块。文本模式适合人类可读的数据,但需要注意换行符转换和缓冲区管理。
字符读写
FILE *fp = fopen("data.txt", "r");
if (fp != NULL) {
int ch;
while ((ch = fgetc(fp)) != EOF) {
putchar(ch); /* 输出到屏幕 */
}
fclose(fp);
}
FILE *fp = fopen("output.txt", "w");
if (fp != NULL) {
fputc('H', fp);
fputc('i', fp);
fputc('\n', fp);
fclose(fp);
}
字符串读写
FILE *fp = fopen("data.txt", "r");
if (fp != NULL) {
char line[256];
while (fgets(line, sizeof(line), fp) != NULL) {
printf("%s", line); /* fgets 保留换行符 */
}
fclose(fp);
}
FILE *fp = fopen("output.txt", "w");
if (fp != NULL) {
fputs("Hello, World!\n", fp);
fputs("Second line\n", fp);
fclose(fp);
}
行数统计
int count_lines(const char *filename)
{
FILE *fp = fopen(filename, "r");
if (fp == NULL) return -1;
int count = 0;
char line[256];
while (fgets(line, sizeof(line), fp) != NULL)
count++;
fclose(fp);
return count;
}
常见错误
混淆 EOF 和字符:
char ch; /* 错误:char 可能无符号 */
while ((ch = fgetc(fp)) != EOF) /* 如果 char 无符号,EOF 永远不等于 ch */
/* 正确 */
int ch; /* int 可以保存 EOF (-1) 和所有字符 */
while ((ch = fgetc(fp)) != EOF)
缓冲区溢出:
char line[10];
fgets(line, 10, fp); /* 最多读 9 字符 + '\0' */
/* 如果行超过 9 字符,只读前 9 个,剩余留在流中 */
最佳实践
- 用
int接收fgetc返回值 fgets指定缓冲区大小- 检查每次读写操作的返回值
- 文本文件用
"r"/"w",二进制用"rb"/"wb" - 注意
fgets保留换行符