【发布时间】:2016-04-12 06:31:00
【问题描述】:
我正在使用pread 读取一个大文件,如下所示:
ssize_t s = pread(fd, buff, count, offset);
if (s != (ssize_t) count)
fprintf(stderr, "s = %ld != count = %ld\n", s, count);
assert(s == (ssize_t ) count);
上面的代码对于小文件(最大 1.5GB)运行良好。但是,对于大文件大小,返回的字节数与预期计数不同。
特别是,对于 2.4GB 文件大小,我的 count 设置为 2520133890 并且断言失败,fprintf 说:
s = 2147479552 != count = 2520133890
令人费解的是,我正在使用 64 位系统,因此,sizeof(ssize_t) = 8。
这个失败的原因是什么,我该如何解决这个问题,以便我可以一次读取整个文件?
【问题讨论】:
-
“偏移量”呢?你确定它包含零吗?
-
count和offset是什么类型的?你是否使用libc中的pread的正确版本,例如在Linux上有pread和pread64,你必须确保你使用pread64函数来自glibc? -
@GiuseppeGuerrini 偏移量始终设置为 0。
-
@user1034749 我明确尝试使用 pread64 并且行为仍然相同。
-
那你需要打印sizeof(off_t), sizeof(size_t), sizeof(ssize_t) 确保它们等于8