我需要将 LFS 添加到使用 fseek()
的 C 进程中。
gcc和glibc的版本分别是3.2.3和2.5。
我做了以下修改:
- 已添加
CFLAGS += -D_FILE_OFFSET_BITS=64
到 makefile。 - 我将调用改为
fseek()
调用fseeko()
(我还需要 MSVC6 支持,但一次一步)。 - 我已将第二个参数的类型更改为
off_t
。sizeof()
变量返回 8。
这是一个很好的示例 main()
因为我可以通过我们的 DLP 及其输出:
fd = fopen("large_file", "rb");
off_t offset = 1ULL << 32;
rc = fseeko(fd, offset, SEEK_SET);
rc = -1 sizeof(offset)=8 errno=22 offset=2147483648
最佳答案
1 << 32
在你的例子中是未定义的行为。它很可能返回 0 或 1。请确保在移位之前将 1 转换为合适的类型。如果unsigned long
也是 32 位,那么 1UL << 32
同样是错误的。
避免-D_LARGEFILE64_SOURCE
和off64_t
,因为它们只会让事情变得更加复杂。相反,仅使用 -D_FILE_OFFSET_BITS=64
并使用off_t
那么应该是 64 位。
关于c - 为什么 fseeko() 会失败并显示 EINVAL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28009799/