1. 什么是fread函数?
fread函数是C语言中的一个标准库函数,用于从文件流中读取数据。其函数原型为:
size_t fread(void *ptr, size_t size, size_t count, FILE *stream);
其中,ptr是读取到的数据存放的数组地址,size是读取单个数据块的字节数,count是要读取的数据块数量,stream是文件指针。
2. fread函数的使用
2.1 打开文件
使用fread函数读取文件前,需要先打开文件,可以使用fopen函数来打开文件,其函数原型为:
FILE *fopen(const char *filename, const char *mode);
其中,filename是要打开的文件名,mode是打开文件的模式。打开文件的模式可以是以下值中的一种:
"r":以只读方式打开文件。
"w":以写入方式打开文件,如果文件已存在,那么文件的内容将被清空。
"a":以写入方式打开文件,如果文件已存在,那么写入的数据将被追加到文件的末尾。
"r+":以读写方式打开文件。
"w+":以读写方式打开文件,如果文件已存在,那么文件的内容将被清空。
"a+":以读写方式打开文件,如果文件已存在,那么写入的数据将被追加到文件的末尾。
下面是一个例子:
#include <stdio.h>
int main() {
FILE *fp;
char buffer[1000];
fp = fopen("test.txt", "r");
if (fp == NULL) {
printf("打开文件失败\n");
return 1;
}
fclose(fp);
return 0;
}
上面的例子中,我们以只读方式打开了test.txt文件,如果文件打开失败,将会输出“打开文件失败”。否则,我们就可以在后面的代码中使用fp这个文件指针来读取文件。
2.2 读取文件
打开文件之后,我们就可以使用fread函数来读取文件了。
size_t fread(void *ptr, size_t size, size_t count, FILE *stream);
fread函数的作用是把文件流stream中的内容读取到ptr数组中,每次读取size字节,读取count次。
下面是一个例子:
#include <stdio.h>
int main() {
FILE *fp;
char buffer[1000];
fp = fopen("test.txt", "r");
if (fp == NULL) {
printf("打开文件失败\n");
return 1;
}
size_t n = fread(buffer, 1, sizeof(buffer), fp);
printf("读取了 %lu 个字节\n", n);
fclose(fp);
return 0;
}
上面的例子中,我们从文件中读取了sizeof(buffer)个字节,并把读取到的内容存放到了buffer数组里。
2.3 关闭文件
使用完文件之后,需要使用fclose函数来关闭文件。其函数原型为:
int fclose(FILE *stream);
其中,stream是要关闭的文件指针,fclose函数返回0表示成功,返回EOF表示失败。
下面是一个例子:
#include <stdio.h>
int main() {
FILE *fp;
char buffer[1000];
fp = fopen("test.txt", "r");
if (fp == NULL) {
printf("打开文件失败\n");
return 1;
}
size_t n = fread(buffer, 1, sizeof(buffer), fp);
printf("读取了 %lu 个字节\n", n);
fclose(fp);
return 0;
}
上面的例子中,我们使用fclose函数来关闭了打开的文件。
3. fread函数使用注意事项
3.1 fread函数返回值
fread函数返回成功读取的数据块个数,如果返回值小于count,则说明可能已经读取到文件末尾。
下面是一个例子:
#include <stdio.h>
int main() {
FILE *fp;
int buffer[1000];
fp = fopen("test.bin", "rb");
if (fp == NULL) {
printf("打开文件失败\n");
return 1;
}
int n = fread(buffer, sizeof(int), 1000, fp);
printf("读取了 %d 个整数\n", n);
fclose(fp);
return 0;
}
上面的例子中,我们读取了1000个整数,每个整数4个字节,如果返回值小于1000,则说明可能已经读取到文件末尾。
3.2 二进制文件和文本文件读取方式不同
fread函数在读取二进制文件(例如图片、音频、视频等)时非常方便,因为二进制文件中的数据是按照二进制格式存储的,而fread函数是按照二进制方式读取数据的。
但是,如果是读取文本文件,则需要注意文本文件中可能包含换行符、回车符、制表符等控制字符,这些字符是无法使用fread函数完整读取的。
下面是一个例子:
#include <stdio.h>
int main() {
FILE *fp;
char buffer[1000];
fp = fopen("test.txt", "r");
if (fp == NULL) {
printf("打开文件失败\n");
return 1;
}
size_t n = fread(buffer, 1, sizeof(buffer), fp);
printf("读取了 %lu 个字节\n", n);
fclose(fp);
return 0;
}
上面的例子中,我们使用fread函数来读取test.txt文件,但是由于文本文件中可能包含换行符、回车符等控制字符,所以fread函数在读取文本文件时可能不太好用。
3.3 使用feof函数检测文件末尾
如果我们要完整地读取一个文件,不仅需要判断fread函数读取的返回值,还需要判断文件是否已经读取到了末尾。可以使用feof函数来判断文件是否已经读取到了末尾。
其函数原型为:
int feof(FILE *stream);
其返回值为0表示文件未结束,返回非0值表示文件已结束。
下面是一个例子:
#include <stdio.h>
int main() {
FILE *fp;
char buffer[1000];
fp = fopen("test.txt", "r");
if (fp == NULL) {
printf("打开文件失败\n");
return 1;
}
while (!feof(fp)) {
int n = fread(buffer, 1, sizeof(buffer), fp);
printf("读取了 %d 个字节\n", n);
}
fclose(fp);
return 0;
}
上面的例子中,我们使用while循环来不断读取文件,直到文件结束为止。
4. 总结
fread函数可以方便地读取二进制文件,但在读取文本文件时需要特别小心。在使用fread函数读取文件时,需要注意读取的返回值和是否已经读取到了文件末尾。