我有两个关于C fread
函数的问题:
我已经读过fread
用于读取二进制文件。但是,当我使用fgets
使用读取模式"r"
和使用fread
使用"rb"
模式的文本文件读取二进制文件时,结果与读取文本文件的结果相同使用fgets
和带有fread
的二进制文件。那么,为什么有不同的函数来读取二进制文件和文本文件?
我正在使用fread
在一次调用中读取10个字节的文件。我应该如何在文件末尾停止阅读 - 即如何在EOF
中指定fread
?
答案 0 :(得分:10)
回答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来检查是否发生了错误或是否已达到文件结尾。
答案 1 :(得分:2)
当你谈到“r”和“rb”模式(文本和二进制)时,你可能指的是fopen。在大多数操作系统上,无论是以二进制模式还是文本模式打开文件都没有区别,但在某些操作系统上,需要在文本模式下进行翻译,这些翻译在二进制模式下被禁用。例如,在DOS或Windows下运行时,行结束字符转换在文本模式下进行,而不是在二进制模式下进行。
习惯使用带有fopen
的“rb”进行二进制文件的习惯,即使它对大多数平台没有影响 - 总有可能在将来的某个时候你的代码可能会需要在重要的操作系统上运行。
答案 2 :(得分:0)
如果我们正在进行二进制I / O,我们通常会想要读或写整个 一次结构。要使用getc或putc执行此操作,我们必须遍历整个结构,一次一个字节,读取或写入每个字节。我们不能使用一次一行的函数,因为fput在遇到空字节时停止写入,并且结构中可能有空字节。类似地,如果任何数据字节是空值或换行符,则fgets将无法正确输入,因此提供了fread和fwrite。