4

lseek()应该返回文件描述符的位置。

文档说:

成功完成后,lseek() 返回从文件开头开始以字节为单位测量的结果偏移位置。否则,返回值 -1 并设置 errno 以指示错误。

麻烦的是,即使这样也行不通:

#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
printf("size off_t: %i\n", sizeof(off_t));

off_t pos;
pos = lseek(file, (off_t)0, SEEK_CUR);
printf("pos: %lli\n", pos);

// same result for SEEK_SET and SEEK_END
pos = lseek(file, (off_t)2352, SEEK_CUR);
printf("pos: %lli\n", pos);

这给了我:

尺寸off_t:8
位置:0
位置:0

为什么是这样?是否有使用原始 I/O 函数查找当前偏移量的替代方法?( read, open, lseek, ...)

编辑1:

我试图让这个例子更简单。

4

5 回答 5

8

尝试将 #include <unistd.h> 添加到顶部。

见:http ://forums.macosxhints.com/archive/index.php/t-35508.html

基本上,因为你没有#include <unistd.h>,编译器是“猜测”lseek()返回一个 int。

可能一个 int 是 4 字节长,并且由于 PPC 是“大端”字节顺序,因此您将获得“顶部”4 个字节,它们都为零。

包含 unistd.h 让编译器意识到它lseek()正在返回一个off_t,所以你不会丢失一半的字节。

于 2009-02-25T20:35:46.753 回答
2

有其他事情发生了,可能是一些愚蠢的事情。我试过你的代码,如下所示:

#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>

int main(int argc, char *argv[]){
    off_t pos;
    int file ;
    if((file = open("/Users/chasrmartin/.bash_history",O_RDONLY)) == -1){
        perror(argv[0]);
        exit(1);
    }
    printf("size off_t: %i\n", sizeof(off_t));

    pos = lseek(file, (off_t)0, SEEK_CUR);
    printf("pos: %lli\n", pos);

    // same result for SEEK_SET and SEEK_END
    pos = lseek(file, (off_t)2352, SEEK_CUR);
    printf("pos: %lli\n", pos);

    exit(0);
}

并得到这个结果:

bash $ gcc foo.c
重击 $ ./a.out
尺寸off_t:8
位置:0
位置:2352

(确切地说,这是在 Intel 的 Mac OS/X 10.5.6 上。)

更新。

或者,也许这并不傻。我刚刚在 PPC G5 上试了一下,得到了你做的结果。

更新 2

好的,这是 PPC 上的结果:

$ gcc foo.c
$ ./a.out
尺寸off_t:8
位置:0
位置:0
于 2009-02-25T19:56:21.607 回答
1

它是什么样的文件?它是一个管道吗?因为如果它不是普通文件,它很可能不支持查找:

lseek() 在无法搜索的设备上的行为是实现定义的。与此类设备关联的文件偏移值未定义。

于 2009-02-25T19:15:17.523 回答
0

您可能希望将测试更改为:

if ( (pos = lseek(file, (off_t)i, SEEK_CUR)) != -1 ) {

您可能在某处打了 -1,但您在这里测试的是 0。

于 2009-02-25T18:37:39.550 回答
0

我不确定我是否理解您的问题,但这里有一些想法可能会有所帮助。

  • 偏移量 0 有效;这意味着你在文件的开头
  • 根据您的平台,off_t 可能会被限制为 32 位无符号。
  • 您是否打算寻求相对于您当前的职位?

——马库斯

于 2009-02-25T18:39:23.273 回答