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

时间:2013-09-21 20:37:28

标签: c stdin fread fseek

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

有没有其他方法能够以简洁有效的方式实现这一目标?假设POSIX。

1 个答案:

答案 0 :(得分: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是一个相当随意的选择 - 但它足够大,不会对输入造成大量的读取,并且小到足以不使用疯狂的堆栈空间。改变这个尺寸你不太可能获得/放松。