当前位置:  开发笔记 > 编程语言 > 正文

fread/fwrite以大小和计数为参数的理由是什么?

如何解决《fread/fwrite以大小和计数为参数的理由是什么?》经验,为你挑选了4个好方法。

我们在这里讨论了为什么fread和fwrite为每个成员计算一个大小并计算并返回读/写成员的数量,而不仅仅是采用缓冲区和大小.我们可以想到的唯一用途是,如果你想读/写一个结构数组,这些结构不能被平台对齐整除,因此已被填充,但这并不能保证这一选择在设计中.

来自FREAD(3):

函数fread()从流指向的流中读取数据的nmemb元素,每个数据字节长,将它们存储在ptr给定的位置.

函数fwrite()将每个大小字节长的数据的nmemb元素写入stream指向的流,从ptr给出的位置获取它们.

fread()和fwrite()返回成功读取或写入的项目数(即不是字符数).如果发生错误或达到文件结尾,则返回值为短项目计数(或零).

Peter Miehle.. 68

fread(buf,1000,1,stream)和fread(buf,1,1000,stream)的区别在于,在第一种情况下,如果文件较小并且在文件中,则只获得一个1000字节或nuthin的块.第二种情况,你得到文件中的所有内容少于1000字节.



1> Peter Miehle..:

fread(buf,1000,1,stream)和fread(buf,1,1000,stream)的区别在于,在第一种情况下,如果文件较小并且在文件中,则只获得一个1000字节或nuthin的块.第二种情况,你得到文件中的所有内容少于1000字节.


虽然这是真的,但这只讲述了故事的一小部分.最好对比读取一些int值或结构数组的东西.
如果理由完成,这将是一个很好的答案.

2> Powerlord..:

它基于fread的实现方式.

单UNIX规范说

对于每个对象,应对fgetc()函数进行大小调用,并按顺序读取存储在unsigned char数组中的结果,该数组与对象完全重叠.

fgetc也有这个说明:

由于fgetc()对字节进行操作,因此读取由多个字节(或"多字节字符")组成的字符可能需要多次调用fgetc().

当然,这早于UTF-8等花哨的可变字节字符编码.

SUS指出,这实际上取自ISO C文件.



3> nos..:

这是纯粹的推测,但是在那些日子里(有些仍然存在)许多文件系统不是硬盘上的简单字节流.

许多文件系统都是基于记录的,因此为了以有效的方式满足这些文件系统,你必须指定项目数("记录"),允许fwrite/fread作为记录在存储上运行,而不仅仅是字节流.



4> Michael Burr..:

在这里,我来修复这些功能:

size_t fread_buf( void* ptr, size_t size, FILE* stream)
{
    return fread( ptr, 1, size, stream);
}


size_t fwrite_buf( void const* ptr, size_t size, FILE* stream)
{
    return fwrite( ptr, 1, size, stream);
}

至于fread()/ 的参数的基本原理fwrite(),我很久以前就丢失了我的K&R副本,所以我只能猜测.我认为可能的答案是Kernighan和Ritchie可能只是认为执行二进制I/O最自然地会在对象数组上完成.此外,他们可能认为块I/O更快/更容易实现,或者在某些架构上更好.

尽管C标准规定了fread()并且fwrite()用和实现,fgetc()并且fputc()记住标准在K&R定义C之后很久就存在,并且标准中指定的内容可能不在原始设计者的想法中.在K&R的"C编程语言"中所说的内容甚至可能与首次设计语言时的内容不同.

最后,这是PJ Plauger fread()在"标准C库"中所说的内容:

如果size(第二个)参数大于1,则无法确定该函数是否还读取了size - 1超出其报告范围的其他字符.作为一项规则,你最好fread(buf, 1, size * n, stream);不要将函数调用为 fread(buf, size, n, stream);

基本上,他说fread()的是界面坏了.因为fwrite()他指出,"写错误通常很少见,所以这不是一个主要的缺点" - 这是我不同意的陈述.


实际上我经常喜欢这样做:`fread(buf,size*n,1,stream);`如果不完整的读取是一个错误条件,那么安排`fread`简单地返回0或1而不是读取的字节数.然后你可以做`if(!fread(...))`而不必将结果与请求的字节数进行比较(这需要额外的C代码和额外的机器代码).
推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有