0

我需要将 LFS 添加到使用fseek(). gcc 和 glibc 分别是 3.2.3 和 2.5 版本。

我做了以下改动:

  1. 添加CFLAGS += -D_FILE_OFFSET_BITS=64到makefile。
  2. 我将调用替换为调用fseek()fseeko()我还需要 MSVC6 支持,但一次一步)。
  3. 我已将第二个参数的类型更改为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

4

2 回答 2

1

1 << 32您的示例中是未定义的行为。它很可能会返回 0 或 1。请确保在转换之前将 1 转换为合适的类型。如果unsigned long也有 32 位,那么1UL << 32同样是错误的。

避免-D_LARGEFILE64_SOURCEand off64_t,因为它们只会让事情变得更复杂。相反,使用 only-D_FILE_OFFSET_BITS=64和 use off_twhich 应该是 64 位。

于 2015-01-18T14:35:30.813 回答
0

下面的程序, CFLAGS = -g2 -Wall -D_LARGEFILE64_SOURCE在这里编译(3.13.0-43-generic #72-Ubuntu SMP Mon Dec 8 19:35:06 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux)

(编译CFLAGS = -g2 -Wall -D_FILE_OFFSET_BITS=64s/off64_t/off_t/工作同样好)

#include <stdio.h>
#include <strings.h>
#include <unistd.h>

int main(void)
{
off64_t offset ;
int rc;
FILE *fp;

fp = fopen("testfile", "r+b");
if (!fp) {
        perror("fopen" );
        return 1;
        }

offset = 1ull << 32;
rc = fseeko(fp, offset, 0);
if (rc < 0) {
        perror("fseeko" );
        return 2;
        }
rc = fwrite( "OMG!", 4, 1, fp);
fprintf(stderr,"Write(4) : %d\n", rc);

fclose(fp);

return 0;
}
于 2015-01-18T14:36:57.060 回答