如何进行文件操作

在 C 语言中,文件操作是通过标准库函数(如 fopenfclosefprintf 等)来完成的。fopen 函数用于打开文件,它的第二个参数是一个字符串,指定了文件的打开模式。常见的模式包括 "w""a""r" 等,每种模式有不同的用途和行为。


1. "r":只读模式(Read)

  • 作用: 打开文件用于读取。

  • 特点:

    • 文件必须存在,否则 fopen 会返回 NULL
    • 不能写入文件。
  • 示例:

    cpp 复制代码
    FILE *file = fopen("example.txt", "r");
    if (file == NULL) {
        printf("文件打开失败!\\\\n");
        return 1;
    }

2. "w":只写模式(Write)

  • 作用: 打开文件用于写入。

  • 特点:

    • 如果文件存在,内容会被清空(覆盖)。
    • 如果文件不存在,会创建一个新文件。
    • 不能读取文件。
  • 示例:

    cpp 复制代码
    FILE *file = fopen("example.txt", "w");
    if (file == NULL) {
        printf("文件打开失败!\\\\n");
        return 1;
    }
    fprintf(file, "Hello, World!\\\\n");
    fclose(file);

3. "a":追加模式(Append)

  • 作用: 打开文件用于追加写入。

  • 特点:

    • 如果文件存在,写入的数据会追加到文件末尾。
    • 如果文件不存在,会创建一个新文件。
    • 不能读取文件。
  • 示例:

    cpp 复制代码
    FILE *file = fopen("example.txt", "a");
    if (file == NULL) {
        printf("文件打开失败!\\\\n");
        return 1;
    }
    fprintf(file, "This is appended text.\\\\n");
    fclose(file);

4. "r+":读写模式(Read and Write)

  • 作用: 打开文件用于读取和写入。

  • 特点:

    • 文件必须存在,否则 fopen 会返回 NULL
    • 写入数据时会从文件开头覆盖原有内容。
    • 可以通过 fseek 调整文件指针的位置。
  • 示例:

    cpp 复制代码
    FILE *file = fopen("example.txt", "r+");
    if (file == NULL) {
        printf("文件打开失败!\\\\n");
        return 1;
    }
    fseek(file, 0, SEEK_END); // 将文件指针移动到末尾
    fprintf(file, "This is added text.\\\\n");
    fclose(file);

5. "w+":读写模式(Write and Read)

  • 作用: 打开文件用于读取和写入。

  • 特点:

    • 如果文件存在,内容会被清空(覆盖)。
    • 如果文件不存在,会创建一个新文件。
    • 可以通过 fseek 调整文件指针的位置。
  • 示例:

    cpp 复制代码
    FILE *file = fopen("example.txt", "w+");
    if (file == NULL) {
        printf("文件打开失败!\\\\n");
        return 1;
    }
    fprintf(file, "This is new content.\\\\n");
    fseek(file, 0, SEEK_SET); // 将文件指针移动到开头
    char buffer[100];
    fgets(buffer, 100, file); // 读取文件内容
    printf("File content: %s", buffer);
    fclose(file);

6. "a+":追加读写模式(Append and Read)

  • 作用: 打开文件用于追加写入和读取。

  • 特点:

    • 如果文件存在,写入的数据会追加到文件末尾。
    • 如果文件不存在,会创建一个新文件。
    • 读取操作可以从文件开头开始,但写入操作只能在文件末尾进行。
  • 示例:

    cpp 复制代码
    FILE *file = fopen("example.txt", "a+");
    if (file == NULL) {
        printf("文件打开失败!\\\\n");
        return 1;
    }
    fprintf(file, "This is appended text.\\\\n");
    fseek(file, 0, SEEK_SET); // 将文件指针移动到开头
    char buffer[100];
    fgets(buffer, 100, file); // 读取文件内容
    printf("File content: %s", buffer);
    fclose(file);

7. 二进制模式

在模式字符串中添加 "b" 可以以二进制模式打开文件(例如 "rb""wb""ab" 等)。二进制模式与文本模式的区别在于:

  • 文本模式:会对换行符进行特殊处理(例如 Windows 中将 \n 转换为 \r\n)。
  • 二进制模式:直接读写原始数据,不做任何转换。

8. 总结

|--------|------------------------|
| 模式 | 描述 |
| "r" | 只读模式,文件必须存在。 |
| "w" | 只写模式,文件存在则清空,不存在则创建。 |
| "a" | 追加模式,文件存在则追加,不存在则创建。 |
| "r+" | 读写模式,文件必须存在。 |
| "w+" | 读写模式,文件存在则清空,不存在则创建。 |
| "a+" | 追加读写模式,文件存在则追加,不存在则创建。 |

相关推荐
LinXunFeng2 小时前
Obsidian - 使用 Share Note 分享笔记并自部署
前端·笔记·github
乘风gg6 小时前
为什么AI 时代来临,大部分人吃不到红利
前端·ai编程·claude
恋猫de小郭6 小时前
Android 限制侧载新进展,谷歌联合国内厂商推验证计划
android·前端·flutter
IT_陈寒6 小时前
Redis内存爆了,原来我漏掉了这个致命配置
前端·人工智能·后端
恋猫de小郭6 小时前
解读 Android 17 全新内存限制,有没有“豁免”后门?
android·前端·flutter
小bo波7 小时前
从"任意文件复制"深挖Java I/O:字符流与字节流的本质抉择
java·nio·io流·后端开发·文件复制
Hyyy7 小时前
理解LLM的基本工作原理:预训练、微调、推理的区别
前端
Gatlin8 小时前
前端逆向与反逆向:一场猫鼠游戏的底层逻辑与实战
前端
Pedantic8 小时前
本地通知(Local Notifications)学习笔记
前端
森蓝情丶9 小时前
我给 AI 搭了个法庭:一个前端仔的 LangGraph 实战全记录
前端·后端