声明fread如下:
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
Run Code Online (Sandbox Code Playgroud)
问题是:两个这样的调用的阅读性能是否存在差异fread:
char a[1000];
Run Code Online (Sandbox Code Playgroud)
fread(a, 1, 1000, stdin);fread(a, 1000, 1, stdin);它会读取1000字节一次,每次?
关于fwrite()中两个参数'size'和'count'的目的似乎存在很多混淆.我想弄清哪个会更快 -
fwrite(source, 1, 50000, destination);
Run Code Online (Sandbox Code Playgroud)
要么
fwrite(source, 50000, 1, destination);
Run Code Online (Sandbox Code Playgroud)
这是我的代码中的一个重要决定,因为此命令将执行数百万次.
现在,我可以跳转到测试并使用可以提供更好结果的那个,但问题是该代码适用于多个平台.
所以,
如何才能获得跨平台更好的答案?
fwrite()的实现逻辑会因平台而异吗?
我知道有类似的问题(什么是FREAD/FWRITE回吐大小的基本原理和计算作为参数?,FWRITE的性能和写入大小),但也明白,这是关于同一个问题不同的问题.在这种情况下,类似问题的答案是不够的.
我试图理解fread()函数是如何<stdio.h>工作的,我对这个函数的返回值感到困惑.在手册页中说
返回值
如果成功,fread()并fwrite()返回读取或写入的项目数.此数字等于仅在大小为1时传输的字节数.如果发生错误或达到文件末尾,则返回值为短项目计数(或零).
fread()不区分文件结束和错误,并且调用者必须使用feof(3)并ferror(3)确定发生了什么.
有人可以向我解释number of items read or written在这种情况下的含义.任何人都可以提供一些示例返回值及其含义吗?
我在 Chromium-os/glibc中查看fread的源代码,对此越来越感到困惑。
首先,我对 fread 被声明为一个宏的方式感到惊讶,它带有函数名,然后是它的参数,最后是它的参数类型:
/* Read NMEMB chunks of SIZE bytes each from STREAM into P. */
size_t
DEFUN(fread, (p, size, nmemb, stream),
PTR p AND size_t size AND size_t nmemb AND register FILE *stream)
Run Code Online (Sandbox Code Playgroud)
这背后的理由是什么,为什么不
size_t fread(PTR p, size_t size, size_t nmemb, register FILE * stream)
Run Code Online (Sandbox Code Playgroud)
哪个更具可读性?
我对这一行特别困惑:
int c = __fillbf(stream);
Run Code Online (Sandbox Code Playgroud)
并且在任何地方都找不到这个功能。我认为这可能是一个我还不知道的系统调用,但它不是表的一部分
那么背后的真正代码是__fill_bf(register FILE *)什么?
编辑:感谢DYP的宏定义, …
我正在尝试编写一个猫克隆来练习C,我有这个代码:
#include <stdio.h>
#define BLOCK_SIZE 512
int main(int argc, const char *argv[])
{
if (argc == 1) { // copy stdin to stdout
char buffer[BLOCK_SIZE];
while(!feof(stdin)) {
size_t bytes = fread(buffer, BLOCK_SIZE, sizeof(char),stdin);
fwrite(buffer, bytes, sizeof(char),stdout);
}
}
else printf("Not implemented.\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我试过了echo "1..2..3.." | ./cat,./cat < garbage.txt但我没有在终端上看到任何输出.我在这做错了什么?
编辑:根据评论和答案,我最终这样做:
void copy_stdin2stdout()
{
char buffer[BLOCK_SIZE];
for(;;) {
size_t bytes = fread(buffer, sizeof(char),BLOCK_SIZE,stdin);
fwrite(buffer, sizeof(char), bytes, stdout);
fflush(stdout);
if (bytes < BLOCK_SIZE)
if (feof(stdin))
break;
} …Run Code Online (Sandbox Code Playgroud)