C 语言文本文件
外观
C语言文本文件操作[编辑 | 编辑源代码]
文本文件是C语言文件操作中最基础的文件类型之一,它以ASCII码形式存储数据,可由文本编辑器直接读取和编辑。本章将详细介绍如何在C语言中打开、读写、关闭文本文件,并探讨常见应用场景。
文本文件基础[编辑 | 编辑源代码]
文本文件由可打印字符组成,每行以换行符('\n')结束。与二进制文件不同,文本文件:
- 人类可读
- 平台相关的换行符处理(Windows为\r\n,Linux为\n)
- 适合存储字符串和格式化数据
文件指针[编辑 | 编辑源代码]
C语言通过FILE*
类型的指针操作文件:
FILE *fp; // 声明文件指针
基本文件操作[编辑 | 编辑源代码]
打开文件[编辑 | 编辑源代码]
使用fopen()
函数:
FILE *fopen(const char *filename, const char *mode);
常用模式:
模式 | 描述 |
---|---|
"r" | 只读(文件必须存在) |
"w" | 只写(创建/清空文件) |
"a" | 追加(创建/追加到文件末尾) |
"r+" | 读写(文件必须存在) |
"w+" | 读写(创建/清空文件) |
示例:
FILE *fp = fopen("example.txt", "r");
if (fp == NULL) {
perror("文件打开失败");
return 1;
}
关闭文件[编辑 | 编辑源代码]
使用fclose()
:
int fclose(FILE *stream);
示例:
if (fclose(fp) != 0) {
perror("文件关闭失败");
}
文本文件读写[编辑 | 编辑源代码]
字符读写[编辑 | 编辑源代码]
int fgetc(FILE *stream)
- 读取单个字符int fputc(int char, FILE *stream)
- 写入单个字符
示例(复制文件):
int ch;
while ((ch = fgetc(source)) != EOF) {
fputc(ch, destination);
}
行读写[编辑 | 编辑源代码]
char *fgets(char *str, int n, FILE *stream)
int fputs(const char *str, FILE *stream)
示例:
char buffer[256];
while (fgets(buffer, sizeof(buffer), fp)) {
printf("%s", buffer);
}
格式化读写[编辑 | 编辑源代码]
int fprintf(FILE *stream, const char *format, ...)
int fscanf(FILE *stream, const char *format, ...)
示例:
fprintf(fp, "姓名: %s, 年龄: %d\n", name, age);
char name[50];
int age;
fscanf(fp, "姓名: %s, 年龄: %d", name, &age);
错误处理[编辑 | 编辑源代码]
检查文件操作是否成功:
ferror(FILE *stream)
- 检查错误feof(FILE *stream)
- 检查文件结束perror(const char *s)
- 打印错误信息
实际案例[编辑 | 编辑源代码]
日志系统[编辑 | 编辑源代码]
使用文本文件记录程序运行信息:
void log_message(const char *message) {
FILE *log = fopen("app.log", "a");
if (log) {
time_t now;
time(&now);
fprintf(log, "[%s] %s\n", ctime(&now), message);
fclose(log);
}
}
配置文件解析[编辑 | 编辑源代码]
解析简单的键值对配置:
# config.ini
username = admin
timeout = 30
解析代码:
char key[50], value[50];
while (fscanf(fp, " %49[^= \t] = %49[^\n]", key, value) == 2) {
printf("配置项: %s = %s\n", key, value);
}
高级主题[编辑 | 编辑源代码]
文件位置控制[编辑 | 编辑源代码]
fseek(FILE *stream, long offset, int whence)
ftell(FILE *stream)
rewind(FILE *stream)
缓冲区管理[编辑 | 编辑源代码]
fflush(FILE *stream)
- 强制写入缓冲区setvbuf()
- 设置缓冲模式
性能考虑[编辑 | 编辑源代码]
- 频繁的小量IO操作比批量操作慢
- 适当使用缓冲区提高性能
- 考虑使用内存映射文件处理大文件
常见问题[编辑 | 编辑源代码]
- Q: 为什么我的文本文件在Windows和Linux上显示不同?
- A: 换行符差异导致,Windows使用\r\n,Linux使用\n
- Q: 如何安全地处理用户提供的文件名?
- A: 始终验证路径,避免目录遍历攻击
总结[编辑 | 编辑源代码]
文本文件操作是C语言基础但强大的功能,掌握这些技术可以实现:
- 数据持久化存储
- 配置管理
- 日志记录
- 数据导入/导出
通过理解文件指针、读写函数和错误处理机制,开发者可以构建健壮的文件处理程序。