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

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

fgetc 和 fputc

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

fgetc 函数

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

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

使用案例

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#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 函数向指定的文件流写入一个字符。其函数原型如下:

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

使用案例

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#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 函数从文件中读取多个对象。其函数原型如下:

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

使用案例

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#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 函数用于将多个对象写入文件。其函数原型如下:

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

使用案例

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#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 则为我们提供了高效的二进制数据读写方式。选择合适的函数并理解其工作原理,能够帮助我们在不同的场景下更有效地进行文件操作。

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

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

https://zglg.work/cplusplus-one/13/

作者

AI免费学习网(郭震)

发布于

2024-08-10

更新于

2024-08-10

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论