C编程中的freadfunction

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

  1. 我已经读过fread用于读取二进制文件。 但是,当我使用读取模式"r"读取带有fgets的二进制文件和使用"rb"模式读取带有fread的文本文件时,结果与使用fgets读取文本文件和使用fread读取二进制文件相同。 那么,为什么有不同的函数来读取二进制文件和文本文件?

  2. 我正在使用fread在一次调用中读取10个字节的文件。 我应该如何在文件末尾停止阅读 – 即如何在fread指定EOF

回答1个问题>

1> fread

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

从流中读取数据块 (尝试理解这一点)

从流中读取一个count元素数组,每个元素的大小都是字节大小,并将它们存储在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来检查是否发生了错误或是否已达到文件结尾。

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

最好养成使用“rb”和fopen进行二进制文件的习惯,即使它对大多数平台没有影响 – 总有可能在未来的某个时候你的代码可能需要在操作系统上运行这很重要。

如果我们正在进行二进制I / O,我们通常希望一次读取或写入整个结构。 要使用getc或putc执行此操作,我们必须循环遍历整个结构,一次一个字节,读取或写入每个字节。 我们不能使用一次一行的函数,因为fput在遇到空字节时停止写入,并且结构中可能有空字节。 类似地,如果任何数据字节是空值或换行符,则fgets将无法正确输入,因此提供了fread和fwrite。