C 编程中的 fread 函数

Posted

技术标签:

【中文标题】C 编程中的 fread 函数【英文标题】:fread Function in C Programming 【发布时间】:2011-12-07 16:28:22 【问题描述】:

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

    我读到fread 用于读取二进制文件。但是,当我使用读取模式"r" 读取带有fgets 的二进制文件和使用"rb" 模式读取带有fread 的文本文件时,结果与读取带有fgets 的文本文件和二进制文件相同与fread。那么,为什么读取二进制文件和文本文件有不同的功能呢?

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

【问题讨论】:

所有文件都是二进制文件,打开方式决定了 END OF LINE 字符是否有意义。 【参考方案1】:

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

养成对二进制文件使用“rb”和fopen 的习惯是个好主意,即使它在大多数平台上都没有影响 - 在将来的某个时候您的代码可能需要在重要的操作系统上运行。

【讨论】:

【参考方案2】:

回答 1 个问题 >

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 来检查是否发生错误或到达文件结尾。

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于C 编程中的 fread 函数的主要内容,如果未能解决你的问题,请参考以下文章

C语言-文件编程

C语言-文件编程

fwrite()函数和fread()函数分别有几个返回值?分别代表啥意思?(C语言)

UNIX编程:--标准I/O库之(fread()write())

C语言 fread 函数

可信安全TEE分析4 Intel SGX 设计和编程