跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C 语言文本文件
”︁(章节)
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= C语言文本文件操作 = '''文本文件'''是C语言文件操作中最基础的文件类型之一,它以ASCII码形式存储数据,可由文本编辑器直接读取和编辑。本章将详细介绍如何在C语言中打开、读写、关闭文本文件,并探讨常见应用场景。 == 文本文件基础 == 文本文件由可打印字符组成,每行以换行符('\n')结束。与二进制文件不同,文本文件: * 人类可读 * 平台相关的换行符处理(Windows为\r\n,Linux为\n) * 适合存储字符串和格式化数据 === 文件指针 === C语言通过<code>FILE*</code>类型的指针操作文件: <syntaxhighlight lang="c"> FILE *fp; // 声明文件指针 </syntaxhighlight> == 基本文件操作 == === 打开文件 === 使用<code>fopen()</code>函数: <syntaxhighlight lang="c"> FILE *fopen(const char *filename, const char *mode); </syntaxhighlight> 常用模式: {| class="wikitable" |- ! 模式 !! 描述 |- | "r" || 只读(文件必须存在) |- | "w" || 只写(创建/清空文件) |- | "a" || 追加(创建/追加到文件末尾) |- | "r+" || 读写(文件必须存在) |- | "w+" || 读写(创建/清空文件) |} 示例: <syntaxhighlight lang="c"> FILE *fp = fopen("example.txt", "r"); if (fp == NULL) { perror("文件打开失败"); return 1; } </syntaxhighlight> === 关闭文件 === 使用<code>fclose()</code>: <syntaxhighlight lang="c"> int fclose(FILE *stream); </syntaxhighlight> 示例: <syntaxhighlight lang="c"> if (fclose(fp) != 0) { perror("文件关闭失败"); } </syntaxhighlight> == 文本文件读写 == === 字符读写 === * <code>int fgetc(FILE *stream)</code> - 读取单个字符 * <code>int fputc(int char, FILE *stream)</code> - 写入单个字符 示例(复制文件): <syntaxhighlight lang="c"> int ch; while ((ch = fgetc(source)) != EOF) { fputc(ch, destination); } </syntaxhighlight> === 行读写 === * <code>char *fgets(char *str, int n, FILE *stream)</code> * <code>int fputs(const char *str, FILE *stream)</code> 示例: <syntaxhighlight lang="c"> char buffer[256]; while (fgets(buffer, sizeof(buffer), fp)) { printf("%s", buffer); } </syntaxhighlight> === 格式化读写 === * <code>int fprintf(FILE *stream, const char *format, ...)</code> * <code>int fscanf(FILE *stream, const char *format, ...)</code> 示例: <syntaxhighlight lang="c"> fprintf(fp, "姓名: %s, 年龄: %d\n", name, age); char name[50]; int age; fscanf(fp, "姓名: %s, 年龄: %d", name, &age); </syntaxhighlight> == 错误处理 == 检查文件操作是否成功: * <code>ferror(FILE *stream)</code> - 检查错误 * <code>feof(FILE *stream)</code> - 检查文件结束 * <code>perror(const char *s)</code> - 打印错误信息 == 实际案例 == === 日志系统 === 使用文本文件记录程序运行信息: <syntaxhighlight lang="c"> 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); } } </syntaxhighlight> === 配置文件解析 === 解析简单的键值对配置: <syntaxhighlight lang="text"> # config.ini username = admin timeout = 30 </syntaxhighlight> 解析代码: <syntaxhighlight lang="c"> char key[50], value[50]; while (fscanf(fp, " %49[^= \t] = %49[^\n]", key, value) == 2) { printf("配置项: %s = %s\n", key, value); } </syntaxhighlight> == 高级主题 == === 文件位置控制 === * <code>fseek(FILE *stream, long offset, int whence)</code> * <code>ftell(FILE *stream)</code> * <code>rewind(FILE *stream)</code> === 缓冲区管理 === * <code>fflush(FILE *stream)</code> - 强制写入缓冲区 * <code>setvbuf()</code> - 设置缓冲模式 <mermaid> graph TD A[打开文件] --> B[读取/写入] B --> C{操作完成?} C -->|否| B C -->|是| D[关闭文件] </mermaid> == 性能考虑 == * 频繁的小量IO操作比批量操作慢 * 适当使用缓冲区提高性能 * 考虑使用内存映射文件处理大文件 == 常见问题 == * '''Q:''' 为什么我的文本文件在Windows和Linux上显示不同? * '''A:''' 换行符差异导致,Windows使用\r\n,Linux使用\n * '''Q:''' 如何安全地处理用户提供的文件名? * '''A:''' 始终验证路径,避免目录遍历攻击 == 总结 == 文本文件操作是C语言基础但强大的功能,掌握这些技术可以实现: * 数据持久化存储 * 配置管理 * 日志记录 * 数据导入/导出 通过理解文件指针、读写函数和错误处理机制,开发者可以构建健壮的文件处理程序。 [[Category:编程语言]] [[Category:C]] [[Category:C 语言文件操作]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)