在文件操作中,除了使用 fopen
和 fclose
进行文件的打开和关闭外,fgetc
、fputc
、fread
以及 fwrite
是非常重要的输入输出函数,它们允许我们以不同的方式读取和写入数据。接下来我们将深入探讨这些函数的用法,并通过案例澄清它们之间的区别和应用场景。
fgetc 和 fputc
fgetc
和 fputc
分别用于字符的读取和写入。这两个函数的使用场景通常是需要以字符为单位操作文本文件。
fgetc 函数
fgetc
函数从指定的文件流中读取下一个字符并返回。其函数原型如下:
1
| int fgetc(FILE *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
fread
和 fwrite
函数用于以块的形式读写数据,这在处理二进制文件或大型数据时尤为高效。
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
文件。
小结
通过 fgetc
和 fputc
我们可以方便地处理文本文件中的字符,而 fread
和 fwrite
则为我们提供了高效的二进制数据读写方式。选择合适的函数并理解其工作原理,能够帮助我们在不同的场景下更有效地进行文件操作。
在下一篇中,我们将讨论文件定位与缓冲,这将进一步让我们了解如何在文件中进行随意读取和写入。