fread
是 C 语言标准库函数之一,用于从文件流中读取数据块。它定义在 <stdio.h>
头文件中。以下是 fread
函数的详细解释和应用示例。
函数原型
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
参数
-
void *ptr
:-
指向存储读取数据的缓冲区的指针。
-
-
size_t size
:-
每个元素的大小(以字节为单位)。
-
-
size_t nmemb
:-
要读取的元素数量。
-
-
FILE *stream
:-
指向文件流的指针,该流必须是以读取模式打开的(如
"r"
或"r+"
)。
-
返回值
-
成功时,返回实际读取的元素数量。
-
如果到达文件末尾或发生错误,返回值可能小于
nmemb
。 -
如果返回值为
0
,可能是因为到达文件末尾或发生错误。
应用示例
1. 读取整数数组
假设我们有一个文件 data.txt
,其中包含一组整数,每个整数占 4 个字节。我们希望读取这些整数并存储在一个数组中。
#include <stdio.h>
int main() {
FILE *file = fopen("data.txt", "r");
if (file == NULL) {
perror("Failed to open file");
return 1;
}
int data[10];
size_t count = fread(data, sizeof(int), 10, file);
printf("Number of integers read: %zu\n", count);
for (size_t i = 0; i < count; i++) {
printf("%d ", data[i]);
}
printf("\n");
fclose(file);
return 0;
}
2. 读取字符数组
假设我们有一个文件 text.txt
,其中包含一些文本。我们希望读取这些文本并存储在一个字符数组中。
#include <stdio.h>
int main() {
FILE *file = fopen("text.txt", "r");
if (file == NULL) {
perror("Failed to open file");
return 1;
}
char buffer[1024];
size_t count = fread(buffer, sizeof(char), 1024, file);
printf("Number of characters read: %zu\n", count);
printf("Content: %s\n", buffer);
fclose(file);
return 0;
}
3. 读取结构体数组
假设我们有一个文件 students.dat
,其中包含一组学生信息,每个学生信息用一个结构体表示。我们希望读取这些学生信息并存储在一个结构体数组中。
#include <stdio.h>
struct Student {
char name[50];
int age;
float grade;
};
int main() {
FILE *file = fopen("students.dat", "rb");
if (file == NULL) {
perror("Failed to open file");
return 1;
}
struct Student students[10];
size_t count = fread(students, sizeof(struct Student), 10, file);
printf("Number of students read: %zu\n", count);
for (size_t i = 0; i < count; i++) {
printf("Name: %s, Age: %d, Grade: %.2f\n", students[i].name, students[i].age, students[i].grade);
}
fclose(file);
return 0;
}
注意事项
-
文件流模式:
-
确保文件是以正确的模式打开的。例如,如果要读取文件,文件必须是以
"r"
或"r+"
模式打开的。
-
-
缓冲区大小:
-
确保缓冲区足够大,以容纳读取的数据。如果缓冲区不足,可能会导致数据截断或程序崩溃。
-
-
错误处理:
-
如果
fread
返回的值小于预期,可能是由于文件末尾或发生错误。可以使用feof
和ferror
函数来检查具体原因。 -
例如:
if (ferror(file)) { perror("Error reading file"); } else if (feof(file)) { printf("End of file reached\n"); }
-
-
文件关闭:
-
使用
fclose
关闭文件,释放资源。 -
例如:
fclose(file);
-
总结
fread
是一个非常有用的函数,用于从文件流中读取数据块。通过指定每个元素的大小和元素数量,可以灵活地读取各种类型的数据,包括整数、字符和结构体等。合理使用 fread
和其他文件操作函数,可以实现对文件的高效读取和管理。