2012-06-27 47 views
1

我正在尝试使用fseek来浏览一个非常大的(〜500 GB)文件。由于FSEEK的第二个参数,偏移,是一个长整型,我必须考虑到当偏移我要的是大于2^31 - 1。这里是我的解决方案:fseek错误与LONG_MAX

fseek(file,offset % LONG_MAX,SEEK_SET);; 
    for (int i = 0; i < offset/LONG_MAX; i++) 
    { 
     fseek(file,LONG_MAX,SEEK_CUR); 
    } 

凡LONG_MAX在限制的定义。 h和偏移量是64位整数。但是,for循环中的fseek调用有错误。它返回一个非零值,perror表示“无效参数”。为什么我不能使用LONG_MAX(定义为2147483647L)作为偏移量?

+0

你确定它是?这里LONG_MAX被定义为9223372036854775807 – PlasmaHH

+0

什么操作系统?您可能需要专门使用64位版本的fseek,例如_fseeki64来访问文件> 4Gb –

+0

是的,程序仅在offset> 2^31 - 1时进入for循环。另外,我的IDE说LONG_MAX被定义为2147483647L。 – awelkie

回答

1

如果您拥有“正常”操作系统,请使用fseek64()变体。

+0

这确实解决了这个问题,但我正在寻找一个独立于编译器的解决方案。现在我将使用fseek64()版本,但是我想知道为什么我不能使用LONG_MAX作为fseek()的偏移量() – awelkie

+0

@Durn:这不是真的,您尝试使用'LONG_MAX'作为抵消 - 这是你试图超越'fseek'功能的能力。你试图让'fseek'函数做一些没有做的事情,这是它告诉你的方式。 –

0

你确定错误是Long_Max?!如果这是您的原始代码,也许这是两个fseek fns中的'file'&'file_'之间的区别?!

+0

对不起,我在发布之前编辑了我的代码,因为某些变量名在上下文中没有意义。所以是的,这不是由于不同的文件ID。 – awelkie