Skip to content

文件

C 语言文件读写操作是指对磁盘上的文件进行读取和写入的操作。这些操作可以通过C语言标准库中提供的函数来实现,例如 fopen、fclose、fread 和 fwrite 等。

打开文件

打开文件需要使用 fopen() 函数,该函数需要两个参数:文件名和打开方式。打开方式有以下选项:

  • "r":只读方式打开文件;
  • "w":只写方式打开文件,如果文件不存在则创建;
  • "a":向文件末尾追加数据;
  • "rb":"r" 方式打开二进制文件;
  • "wb":"w" 方式打开二进制文件;
  • "ab":"a" 方式打开二进制文件。

打开文件成功后,fopen() 函数会返回一个文件指针,用于后续的读写操作。

c
FILE *fp;
fp = fopen("example.txt", "r");
if(fp == NULL) {
   printf("Error opening file.");
   return -1;
}

读取文件

读取文件需要使用 fread() 函数,该函数需要四个参数:读取缓冲区、每个元素大小、元素个数、文件指针。该函数会将读取的数据存放到缓冲区中,返回值为实际读取的元素个数。

c
FILE *fp;
char buffer[100];

/* Open file for reading */
fp = fopen("example.txt", "r");

/* Read and display data */
fread(buffer, sizeof(buffer), 1, fp);
printf("%s", buffer);

/* Close file */
fclose(fp);

写入文件

写入文件需要使用 fwrite() 函数,该函数需要四个参数:写入缓冲区、每个元素大小、元素个数、文件指针。该函数会将缓冲区中的数据写入到文件中,返回值为实际写入的元素个数。

c
FILE *fp;

/* Open file for writing */
fp = fopen("example.txt", "w");

/* Write data to the file */
fwrite("This is an example.", sizeof(char), 19, fp);

/* Close file */
fclose(fp);

关闭文件

关闭文件需要使用 fclose() 函数,该函数需要一个参数:文件指针。该函数会将文件指针所指向的文件关闭,并释放相关资源。

c
FILE *fp;
fp = fopen("example.txt", "r");
if(fp == NULL) {
   printf("Error opening file.");
   return -1;
}

/* Perform operations on the file */

/* Close the file */
fclose(fp);

文件读写示例

c
#include <stdio.h>
#include <stdlib.h>

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

    // 写入文件
    fp = fopen("file.txt", "w");
    fputs("Hello, World!", fp);
    fclose(fp);

    // 读取文件
    fp = fopen("file.txt", "r");
    fgets(buffer, 255, fp);
    printf("%s\n", buffer);
    fclose(fp);

    return 0;
}

读写异常场景

  • 文件打开失败可能会出现以下几种原因:文件不存在、文件只读不能写、权限不足、磁盘已满。
  • 文件读写失败可能会出现以下几种原因:读取或写入数据长度大于缓冲区、写入磁盘错误等。
  • 内存分配失败可能会导致严重的问题,需要使用动态内存分配函数,并检查返回值是否为 NULL。

随机访问

文件随机访问是一种比较常见的操作方式。所谓文件随机访问,指的是我们可以通过指定文件内部的位置来进行读写操作。

文件定位

在随机访问之前,我们需要 先确定文件要读写的位置,这个位置通常使用一个整数值表示,即偏移量 offset, 偏移量从文件开头计算,以字节为单位。

以下两个函数用于定位到特定的偏移量, 这两个函数都需要一个指向文件结构体类型的指针作为入参,此外 fseek() 函数还需要两个额外参数:

fseek(): 用于设置当前读写位置,函数将返回 0 表示成功,-1 表示失败。

c
  int fseek(FILE *stream, long offset, int whence);
  • 偏移量 offset: 表示相对于 whence 参数所指示位置的偏移量。
  • whence 参数:表示起始点。它应该是下列常数之一:
    • SEEK_SET:从文件开头开始计算
    • SEEK_CUR:从当前读写位置开始计算
    • SEEK_END:从文件结尾开始计算

例如,将当前位置设置为距离文件开头 10 个字节处

c
// 定义一个 FILE 指针 fp

// 将当前位置设为距离开头 10 个字节处
fseek(fp, 10L, SEEK_SET);

ftell(): 用于获取当前读写位置, 函数将返回当前读写位置的偏移量,如果出现错误则返回 -1。

c
long ftell(FILE *stream);

文件读写

一旦我们确定了要读写的位置,就可以使用标准库中的函数进行文件读写操作了。以下是常用的文件读写函数:

  • fread():从文件中读取数据。
  • fwrite():向文件中写入数据。
  • fgets():从文件中读取一行字符串。
  • fputs():向文件中写入一行字符串。

这些函数都需要一个指向 FILE 结构体类型的指针作为参数。此外,它们还需要其他参数以确定要读写的内容和长度等信息。

例如,以下代码将会从当前位置开始,读取 100 字节长度的数据到 buffer 数组中:

c
// 定义一个 FILE 指针 fp 和一个 char 类型数组 buffer

// 从当前位置开始,读取 100 字节长度的数据到 buffer 数组中
fread(buffer, sizeof(char), 100, fp);

同样地,我们也可以使用类似的方式进行文件写入操作。例如,以下代码将会在当前位置开始,向文件中写入 buffer 数组内存储的数据:

c
// 定义一个 FILE 指针 fp 和一个 char 类型数组 buffer

// 在当前位置开始,向文件中写入 buffer 数组内存储的数据
fwrite(buffer, sizeof(char), strlen(buffer), fp);

随机读写示例

c
#include <stdio.h>

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

    // 打开文件
    fp = fopen("test.c", "r+");

    // 定位到距离开头 10 个字节处
    fseek(fp, 10L, SEEK_SET);

    // 从当前位置开始,读取 100 字节长度的数据到 buffer 数组中
    fread(buffer, sizeof(char), 100, fp);

    // 在当前位置开始,向文件中写入 buffer 数组内存储的数据
    fwrite(buffer, sizeof(char), strlen(buffer), fp);

    // 关闭文件
    fclose(fp);

    return 0;
}

总结

总的来说,文件读写操作是 C 语言编程中必不可少的一部分,掌握好文件读写操作可以方便我们进行文件的读取和写入。在实际应用中,需要注意文件名、文件路径的正确性,以及适当的错误处理等问题。

Released under the MIT License.