Jupyter AI

13 文件操作之 fgetc/fputc 与 fread/fwrite

📅发表日期: 2024-08-10

🏷️分类: C进阶

👁️阅读次数: 0

在文件操作中,除了使用 fopenfclose 进行文件的打开和关闭外,fgetcfputcfread 以及 fwrite 是非常重要的输入输出函数,它们允许我们以不同的方式读取和写入数据。接下来我们将深入探讨这些函数的用法,并通过案例澄清它们之间的区别和应用场景。

fgetc 和 fputc

fgetcfputc 分别用于字符的读取和写入。这两个函数的使用场景通常是需要以字符为单位操作文本文件。

fgetc 函数

fgetc 函数从指定的文件流中读取下一个字符并返回。其函数原型如下:

int fgetc(FILE *stream);
  • stream: 指向打开的文件的指针。

使用案例

以下是一个使用 fgetc 读取文本文件内容的简单示例:

#include <stdio.h>

int main() {
    FILE *file = fopen("example.txt", "r");
    if (file == NULL) {
        perror("Failed to open file");
        return 1;
    }

    int ch;
    while ((ch = fgetc(file)) != EOF) {
        putchar(ch); // 输出到控制台
    }

    fclose(file);
    return 0;
}

在这个示例中,程序从 example.txt 文件中逐字符读取内容,并将其打印到控制台。fgetc 函数返回 EOF(文件结束标志)时停止读取。

fputc 函数

fputc 函数向指定的文件流写入一个字符。其函数原型如下:

int fputc(int char, FILE *stream);
  • char: 要写入的字符(以整型形式提供)。
  • stream: 指向打开的文件的指针。

使用案例

以下是一个使用 fputc 写入字符到文本文件的示例:

#include <stdio.h>

int main() {
    FILE *file = fopen("output.txt", "w");
    if (file == NULL) {
        perror("Failed to create file");
        return 1;
    }

    const char *str = "Hello, World!";
    while (*str) {
        fputc(*str++, file);
    }

    fclose(file);
    return 0;
}

这个示例将在 output.txt 文件中逐字符写入字符串 "Hello, World!"

fread 和 fwrite

freadfwrite 函数用于以块的形式读写数据,这在处理二进制文件或大型数据时尤为高效。

fread 函数

fread 函数从文件中读取多个对象。其函数原型如下:

size_t fread(void *ptr, size_t size, size_t count, FILE *stream);
  • ptr: 指向存储读取数据的缓冲区的指针。
  • size: 每个对象的字节大小。
  • count: 要读取的对象数量。
  • stream: 指向打开的文件的指针。

使用案例

以下是一个使用 fread 读取二进制文件的示例:

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

typedef struct {
    int id;
    char name[20];
} Student;

int main() {
    FILE *file = fopen("students.bin", "rb");
    if (file == NULL) {
        perror("Failed to open file");
        return 1;
    }

    Student students[10];
    size_t read_count = fread(students, sizeof(Student), 10, file);
    for (size_t i = 0; i < read_count; i++) {
        printf("ID: %d, Name: %s\n", students[i].id, students[i].name);
    }

    fclose(file);
    return 0;
}

在这个例子中,程序从 students.bin 文件中读取最多 10 个学生记录,并打印其 ID 和姓名。

fwrite 函数

fwrite 函数用于将多个对象写入文件。其函数原型如下:

size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream);
  • ptr: 指向要写入的对象的指针。
  • size: 每个对象的字节大小。
  • count: 要写入的对象数量。
  • stream: 指向打开的文件的指针。

使用案例

以下是一个使用 fwrite 写入二进制文件的示例:

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

typedef struct {
    int id;
    char name[20];
} Student;

int main() {
    FILE *file = fopen("students.bin", "wb");
    if (file == NULL) {
        perror("Failed to create file");
        return 1;
    }

    Student students[2] = {
        {1, "Alice"},
        {2, "Bob"}
    };

    fwrite(students, sizeof(Student), 2, file);
    fclose(file);
    return 0;
}

在这个示例中,程序将两个学生记录以二进制格式写入 students.bin 文件。

小结

通过 fgetcfputc 我们可以方便地处理文本文件中的字符,而 freadfwrite 则为我们提供了高效的二进制数据读写方式。选择合适的函数并理解其工作原理,能够帮助我们在不同的场景下更有效地进行文件操作。

在下一篇中,我们将讨论文件定位与缓冲,这将进一步让我们了解如何在文件中进行随意读取和写入。

💬 评论

暂无评论