C 文件读写

关键要点

  • C语言的文件读写通过标准库<stdio.h>中的函数实现,主要包括fopen(打开文件)、fclose(关闭文件)、fread/fwrite(读写二进制文件)以及fscanf/fprintf(格式化读写文本文件)。
  • 研究表明,文件操作通常分为文本模式和二进制模式,文本模式适合人类可读的数据,二进制模式适合高效存储复杂数据。
  • 证据倾向于建议在使用文件操作时,始终检查fopen的返回值以确保文件成功打开,并使用适当的模式(如“r”读取、“w”写入)。

文件读写概述

C语言提供强大的文件读写功能,允许程序与外部存储设备(如硬盘)交互,持久化存储和读取数据。以下是关于C语言文件读写的详细指南,涵盖文件类型、文件指针、打开模式、读写函数以及关闭文件等内容。

文件类型

  • 文本文件:以ASCII字符形式存储数据,可直接用文本编辑器打开和编辑。常见扩展名如.txt
  • 二进制文件:以二进制形式(0和1)存储数据,不易直接阅读,通常用于存储复杂数据结构。常见扩展名如.bin

文件指针

  • 文件指针是C语言中用于表示文件的引用,用于执行文件操作(如打开、读取、写入、关闭)。
  • 文件指针的类型为FILE,定义在<stdio.h>头文件中。
  • 声明方式:FILE *fp;

打开文件

  • 使用fopen()函数打开文件。
  • 语法:FILE *fopen(const char *filename, const char *mode);
  • 参数:
  • filename:文件名或路径。
  • mode:指定打开文件的目的(例如,“r”表示读取,“w”表示写入,“a”表示追加)。
  • 返回值:成功时返回文件指针,失败时返回NULL

文件打开模式

文件打开模式决定了文件的操作方式,以下是常见模式:

  • 读取模式
  • "r":以文本模式读取。如果文件不存在,返回NULL
  • "rb":以二进制模式读取。
  • 写入模式
  • "w":以文本模式写入。如果文件存在,则截断;如果不存在,则创建。
  • "wb":以二进制模式写入。
  • 追加模式
  • "a":以文本模式追加。如果文件不存在,则创建。
  • "ab":以二进制模式追加。
  • 读写模式
  • "r+":以文本模式读写。
  • "rb+":以二进制模式读写。
  • "w+":以文本模式读写,存在则截断,不存在则创建。
  • "wb+":以二进制模式读写。
  • "a+":以文本模式读写,追加模式。
  • "ab+":以二进制模式读写,追加模式。

创建文件

  • 要创建新文件,使用fopen()并选择适当的模式,如"w""w+""wb""wb+""a""a+""ab""ab+"

写入文件

  • 使用以下函数向文件写入数据:
  • fprintf():格式化输出,类似于printf()
  • fputs():写入字符串,带换行符。
  • fputc():写入单个字符。
  • fputw():写入数字。
  • fwrite():写入二进制数据。
    • 语法:fwrite(ptr, size, nmemb, file_pointer)

读取文件

  • 使用以下函数从文件中读取数据:
  • fscanf():格式化输入,类似于scanf()
  • fgets():读取整行文本。
  • fgetc():读取单个字符。
  • fgetw():读取数字。
  • fread():读取二进制数据。
    • 语法:fread(ptr, size, nmemb, file_pointer)
  • 注意:读取时,文件结束时返回EOF,需检查以避免错误。

关闭文件

  • 操作完成后,使用fclose(file_pointer)关闭文件,释放资源。

移动文件指针

  • 使用fseek(fp, offset, whence)移动文件指针。
  • whence可以是:
  • SEEK_SET:从文件开头计算。
  • SEEK_CUR:从当前位置计算。
  • SEEK_END:从文件末尾计算。
  • 示例:rewind(fp);将指针移动到文件开头。

二进制文件操作

  • 二进制文件通常使用"rb""wb""ab"等模式打开。
  • 写入使用fwrite(),读取使用fread()

详细报告

C语言的文件读写功能是程序与外部存储设备交互的核心,允许持久化存储和读取数据。以下是基于可靠来源(如GeeksforGeeks、Programiz和TutorialsPoint)的详细分析,涵盖文件操作的各个方面。

文件类型与特性

文件分为两种主要类型:

  • 文本文件:存储为ASCII字符,适合人类可读的数据,如日志文件。优点是易于编辑,缺点是存储效率较低。
  • 二进制文件:以0和1的形式存储,适合存储复杂数据结构,如图像或程序执行文件。优点是存储效率高,安全性较高,缺点是不可直接阅读。

文件指针与标准库

文件操作依赖于<stdio.h>中的FILE类型,文件指针是所有文件操作的核心。声明文件指针的示例:

FILE *fp;

文件指针用于跟踪文件的位置和状态,所有读写操作都通过它进行。

文件打开与模式

fopen()函数是打开文件的入口,语法为:

FILE *fopen(const char *filename, const char *mode);
  • filename可以是相对路径(如”example.txt”)或绝对路径。
  • mode决定了文件的操作方式,常见模式如下表所示:
模式描述文本/二进制
“r”读取,文件不存在返回NULL文本
“rb”读取二进制文件二进制
“w”写入,存在则截断,不存在则创建文本
“wb”写入二进制文件二进制
“a”追加,文件末尾写入,不存在则创建文本
“ab”追加二进制文件二进制
“r+”读写,文件不存在返回NULL文本
“rb+”读写二进制文件二进制
“w+”读写,存在则截断,不存在则创建文本
“wb+”读写二进制文件二进制
“a+”读写,追加模式文本
“ab+”读写二进制文件,追加模式二进制

研究表明,选择适当的模式对文件操作的安全性和效率至关重要。例如,使用"w"模式会覆盖现有文件,需谨慎操作。

文件创建

创建文件时,通常使用写入或追加模式,如"w""a"。如果文件不存在,fopen()会自动创建;如果存在,"w"会清空内容,"a"会在末尾追加。

写入文件函数

以下是常用写入函数:

  • fprintf(fp, "格式化字符串", 参数);:类似于printf(),支持格式化输出。
  • fputs("字符串\n", fp);:写入字符串,自动添加换行。
  • fputc('字符', fp);:写入单个字符。
  • fputw(数字, fp);:写入整数。
  • fwrite(ptr, size, nmemb, fp);:写入二进制数据,适合复杂数据结构。

示例:

FILE *fp = fopen("output.txt", "w");
fprintf(fp, "数字:%d\n", 10);
fclose(fp);

读取文件函数

以下是常用读取函数:

  • fscanf(fp, "格式化字符串", &变量);:格式化输入,类似于scanf()
  • fgets(buffer, sizeof(buffer), fp);:读取整行文本。
  • fgetc(fp);:读取单个字符。
  • fgetw(fp);:读取整数。
  • fread(ptr, size, nmemb, fp);:读取二进制数据。

读取时需注意文件结束标志EOF,示例:

FILE *fp = fopen("input.txt", "r");
char buffer[255];
while (fgets(buffer, sizeof(buffer), fp) != NULL) {
    printf("%s", buffer);
}
fclose(fp);

关闭文件

使用fclose(fp)关闭文件,释放资源。研究建议始终关闭文件以避免资源泄漏,尤其在处理多个文件时。

文件指针移动

fseek()函数用于移动文件指针,语法为:

int fseek(FILE *stream, long offset, int whence);
  • whence可以是SEEK_SET(文件开头)、SEEK_CUR(当前位置)、SEEK_END(文件末尾)。
  • 示例:rewind(fp);将指针移动到文件开头。

二进制文件操作

二进制文件操作通常使用"rb"、”wb”等模式,fwrite()fread()是核心函数。示例:

FILE *fp = fopen("data.bin", "wb");
int data = 100;
fwrite(&data, sizeof(int), 1, fp);
fclose(fp);

最佳实践

  • 始终检查fopen()返回值,避免空指针操作。
  • 使用适当的模式,避免意外覆盖文件。
  • 处理文件结束时,检查EOF以确保读取完整。
  • 关闭文件后,确认操作成功。

示例代码

以下是一个综合示例,展示文件读写操作:

#include <stdio.h>

int main() {
    FILE *fp;
    char buffer[255];

    // 写入文件
    fp = fopen("example.txt", "w");
    if (fp == NULL) {
        printf("无法打开文件。\n");
        return 1;
    }
    fprintf(fp, "Hello, World!\n");
    fclose(fp);

    // 读取文件
    fp = fopen("example.txt", "r");
    if (fp == NULL) {
        printf("无法打开文件。\n");
        return 1;
    }
    fgets(buffer, sizeof(buffer), fp);
    printf("读取内容:%s", buffer);
    fclose(fp);

    return 0;
}

参考资料

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注