lseek中的偏移(第二)参数

时间:2014-02-19 11:27:27

标签: c linux lseek

我运行以下程序。我预计它会给出错误。但它完美运行并提供输出。

程序:

#include <stdio.h> 
#include <unistd.h>
#include <fcntl.h>
#include <string.h> 
#include <stdlib.h>

int main()
{
    int fd, retval;
    char wBuf[20] = "Be my friend", rBuf[20] = {0};

    fd = open("test.txt", O_RDWR | O_CREAT, 0666);
    write(fd, wBuf, strlen(wBuf));

    retval = lseek(fd, -3L, SEEK_END); //Observe 2nd argument
    if(retval < 0) {
            perror("lseek");
            exit(1);
    }

    read(fd, rBuf, 5);
    printf("%s\n", rBuf);
}

lseek也适用于

lseek(fd, -3I, SEEK_END); //but didn't print anything

对于其他字母,它会给出错误,如

error: invalid suffix "S" on integer constant

lseek上LI的含义是什么?

2 个答案:

答案 0 :(得分:2)

L只是意味着常量将被视为long类型而不是默认的整数类型。

I不是标准的C后缀,因此,除非您的编译器具有某种扩展名(a),否则它不应该有效。 可能是因为大写l而误认为是小写L(与I相同),尽管在这种情况下,我怀疑它仍然会寻找,阅读和打印,这似乎表明它没有。

事实上,我能想到你可以在标准C中使用I并且不打印任何内容的唯一方法就是:

#define I * 0

可以有效地将lseek参数转换为零。


(a)例如gcc及其复杂的数据类型,可能就是这种情况。将其中一个传递给lseek的效果最多可能是功能失调。

也许这是尝试寻找文件中的特定角色位置,然后也寻找与该位置成直角: - )

答案 1 :(得分:0)

字面数字上的L后缀仅表示数字类型为long而非默认值int

123 //this is an int
123L //this is a long

I后缀是complex/imaginary numbers的gcc扩展名。

123; //this is an int
123I; //this is a _Complex

在C中,整数常量有以下后缀(它们不区分大小写)

  • l很长时间,
  • ll很长一段时间。
  • u表示无符号

对于浮点常数:

  • f浮动。
  • l for long double

(以及特定编译器可能支持的任何扩展。)