0

我运行下面的程序。我预计它会出错。但它运行完美并给出了输出。

程序:

#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

lseekL和on是什么意思?I

4

2 回答 2

2

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

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

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

#define I * 0

这将有效地将lseek论点变成零。


(a)如 gcc 及其复杂的数据类型,视情况而定。将其中之一传递给lseek它的效果充其量可能是功能失调的。

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

于 2014-02-19T11:35:55.730 回答
0

文字数字上的 L 后缀仅表示数字的类型long而不是默认值int

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

I 后缀是复数/虚数的 gcc 扩展。

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

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

  • l长久以来,
  • ll好久好久。
  • u对于未签名

对于浮点常量:

  • f为浮动。
  • l长双

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

于 2014-02-19T11:38:22.933 回答