C语言“fread”函数的用法?

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函数读取文件时,需要注意读取的返回值和是否已经读取到了文件末尾。

后端开发标签