跳转到内容

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() - 设置缓冲模式

graph TD A[打开文件] --> B[读取/写入] B --> C{操作完成?} C -->|否| B C -->|是| D[关闭文件]

性能考虑[编辑 | 编辑源代码]

  • 频繁的小量IO操作比批量操作慢
  • 适当使用缓冲区提高性能
  • 考虑使用内存映射文件处理大文件

常见问题[编辑 | 编辑源代码]

  • Q: 为什么我的文本文件在Windows和Linux上显示不同?
  • A: 换行符差异导致,Windows使用\r\n,Linux使用\n
  • Q: 如何安全地处理用户提供的文件名?
  • A: 始终验证路径,避免目录遍历攻击

总结[编辑 | 编辑源代码]

文本文件操作是C语言基础但强大的功能,掌握这些技术可以实现:

  • 数据持久化存储
  • 配置管理
  • 日志记录
  • 数据导入/导出

通过理解文件指针、读写函数和错误处理机制,开发者可以构建健壮的文件处理程序。