首页 文章

非常大的fseek前锋相当于stdin?

提问于
浏览
1

我在stdin上有一个非常大的,已知的字节数,并希望在读取感兴趣的部分之前丢弃一个大的(也是已知的)数字(换句话说,我想通过一个大整数向前推进,但是fseek isn没有为管道定义 . 实现这一目标的最简单方法似乎是对fgetc的大量调用,第一种方法是使用单个调用fread,并使用分配的大型临时指针来存储结果 . 第一个非常慢,第二个使用可能无限量的内存,没有充分的理由 . 制作多个较小的读取可以解决无限制的内存使用问题,但会引入一个自由参数(块大小),它可能对每个机器和操作系统组合具有不同的最快值 .

是否有任何替代方案能够以简洁有效的方式实现这一目标? POSIX是假定的 .

1 回答

  • 2

    没有办法“跳过”管道上的数据 - 你必须阅读它 .

    如果它是一个非常大的块,你将需要使用一个中等大小的缓冲区(作为开销和内存使用之间的折衷),如下所示:

    size_t dataToRead = some_large_number;
    
     while(dataToRead)
     {
        char buffer[4096];
        size_t toread = min(sizeof(buffer), dataToRead);
        size_t nread = fread(buffer, 1, toread, stdin);
        dataToRead -= nread;
     }
    

    4096的大小是一个相当随意的选择 - 但它足够大,不会对输入产生大量的读取,并且足够小,不会使用大量的堆栈空间 . 改变这个尺寸你不太可能获得/放松 .

相关问题