C编程中的fread函数

7

关于 C 语言的 fread 函数,我有两个问题:

  1. 我读到过 fread 用于读取二进制文件。但是,当我使用读模式为 "r"fgets 读取二进制文件,以及使用模式为 "rb"fread 读取文本文件时,结果与使用 fgets 读取文本文件和使用 fread 读取二进制文件时的结果相同。所以,为什么需要不同的函数来读取二进制文件和文本文件呢?

  2. 我正在使用 fread 一次读取文件中的 10 个字节。那么在文件结尾处如何停止读取呢?也就是说,在 fread 函数中如何指定 EOF


2
所有文件都是二进制文件,打开方式决定了行末字符是否应被解释。 - AndersK
3个回答

10

1>fread

size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );

从流中读取数据块(尝试理解此内容)

从流中读取一个数组,包含count个元素,每个元素的大小为size字节,并将它们存储在由ptr指定的内存块中。 如果成功,则流的位置指示器将向前移动读取的总字节数。成功读取的总字节数为(size * count)。

2>fgets函数

char * fgets ( char * str, int num, FILE * stream );

从流中获取字符串(尝试理解这句话)

从流中读取字符,并将它们作为 C 字符串存储到 str 中,直到已经读取了 (num-1) 个字符或者读取到换行符或文件末尾(以先到者为准)。 换行符会使 fgets 停止读取,但它被视为有效字符,因此它被包含在复制到 str 中的字符串中。 一个空字符会自动添加到 str 中,在读取的字符后面表示 C 字符串的结尾。


第二个问题的答案 在 fread 中返回值是:

成功读取的元素总数作为 size_t 对象返回,它是一种整数数据类型。 如果这个数字与 count 参数不同,则表示发生了错误或已达到文件末尾。

您可以使用 ferror 或 feof 来检查是否发生了错误或者已经达到了文件末尾。


2
当你谈论“r”和“rb”模式(文本和二进制)时,你可能在提到fopen。在大多数操作系统上,打开文件时使用二进制模式或文本模式没有区别,但是在某些操作系统上,在文本模式下需要进行禁用二进制模式的翻译。例如,在DOS或Windows下运行时,文本模式下发生换行符转换,而二进制模式下不会发生。

最好养成使用“rb”与fopen一起处理二进制文件的习惯,即使在大多数平台上它没有影响-总有可能将来您的代码需要在某个重要的操作系统上运行,这时它就显得很重要了。


0

如果我们进行二进制 I/O,通常会希望一次读取或写入整个结构。要使用 getc 或 putc 实现这一点,我们必须逐字节循环遍历整个结构,并读取或写入每个字节。我们不能使用逐行函数,因为 fputs 当遇到空字节时停止写入,而在结构中可能有空字节。同样,如果任何数据字节是空字符或换行符,fgets 在输入上无法正常工作,因此提供了 fread 和 fwrite。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接