相关疑难解决方法(0)

fread如何真正起作用?

声明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)
  1. fread(a, 1, 1000, stdin);
  2. fread(a, 1000, 1, stdin);

它会读取1000字节一次,每次?

c fread

72
推荐指数
4
解决办法
7万
查看次数

fwrite() - 大小和计数对性能的影响

关于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的性能和写入大小),但也明白,这是关于同一个问题不同的问题.在这种情况下,类似问题的答案是不够的.

c io performance fwrite

18
推荐指数
2
解决办法
7140
查看次数

fread()返回C中的值

我试图理解fread()函数是如何<stdio.h>工作的,我对这个函数的返回值感到困惑.在手册页中说

返回值
如果成功,fread() 并fwrite()返回读取或写入的项目数.此数字等于仅在大小为1时传输的字节数.如果发生错误或达到文件末尾,则返回值为短项目计数(或零).

fread()不区分文件结束和错误,并且调用者必须使用feof(3)并ferror(3)确定发生了什么.

有人可以向我解释number of items read or written在这种情况下的含义.任何人都可以提供一些示例返回值及其含义吗?

c

9
推荐指数
2
解决办法
3万
查看次数

Chromium OS 中 fread 的这种实现是由什么组成的?

我在 Chromium-os/glibc中查看fread的源代码,对此越来越感到困惑。

注意:我说的是源代码,而不是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)

哪个更具可读性?


什么是 __fillbf(register FILE *stream)

我对这一行特别困惑:

int c = __fillbf(stream);
Run Code Online (Sandbox Code Playgroud)

并且在任何地方都找不到这个功能。我认为这可能是一个我还不知道的系统调用,但它不是表的一部分

那么背后的真正代码是__fill_bf(register FILE *)什么?

编辑:感谢DYP的宏定义, …

c libc

6
推荐指数
1
解决办法
98
查看次数

从stdin读取写入C中的stdout

我正在尝试编写一个猫克隆来练习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)

c io stdin stdout stdio

4
推荐指数
1
解决办法
4万
查看次数

标签 统计

c ×5

io ×2

fread ×1

fwrite ×1

libc ×1

performance ×1

stdin ×1

stdio ×1

stdout ×1