lseek问题

时间:2011-05-21 13:38:00

标签: c

我很难弄清楚lseek无法正常工作的原因。基本上我需要做的就是从标准输入中获取输入,将其存储到名为“log.txt”的文件中,并在遇到“STOP”字时让程序停止。

我的问题是,当我尝试运行程序时,我得到了一个lseek错误:非法搜索,我不知道为什么。我认为这个问题是对lseek的调用,但如果我用lseek(fd, 0, SEEK_END)替换lseek(fd, atol(0), SEEK_END),我会遇到分段错误。

我很困惑,我不知道怎么办才能解决这个问题,希望你能给出你的建议。

int fd;
char buffer[SIZE];
int n, cur;

if (fd = open("log.txt", O_RDWR, S_IRWXU|S_IRWXG|S_IRWXO) < 0)
{
    perror("Error: open");
    return 1;
}

if ((cur = lseek(fd, 0, SEEK_END)) < 0)
{
    printf("Offset corrente: %d\n", (int) lseek(fd, SIZE, SEEK_CUR));
    perror("Error: lseek");
    return 2;
}

while ((n = read(fd, buffer, SIZE)) > 0 && (strncmp(buffer, "STOP", 4) != 0))
{
    write(fd, buffer, SIZE);
}

4 个答案:

答案 0 :(得分:4)

if (fd = open("log.txt", O_RDWR, S_IRWXU|S_IRWXG|S_IRWXO) < 0)

应该是

if ((fd = open("log.txt", O_RDWR, S_IRWXU|S_IRWXG|S_IRWXO)) < 0)

否则将被解析为

if (fd = (open("log.txt", O_RDWR, S_IRWXU|S_IRWXG|S_IRWXO) < 0))

(因为<的运算符优先级高于=);如果open()成功,它将返回一个&gt; = 0的值,因此表达式open(...) < 0将为false,因此fd将设置为0.

文件描述符0表示进程的标准输入。除非你重定向它,否则这将是一个终端设备,寻求是非法的。

答案 1 :(得分:3)

您正在阅读和写入同一个文件

 read(fd, buffer, SIZE)

错了。你想阅读stdin。

答案 2 :(得分:2)

if ((cur = lseek(fd, 0, SEEK_END)) < 0)

应更改为:

if ((cur = lseek(fd, 0, SEEK_END)) == -1)

在某些情况下,lseek可能会提供负偏移。因此,在测试错误时,只应使用x == -1,而不是x&lt; 0

答案 3 :(得分:1)

您不仅读取相同的文件,read()读取SIZE字节。 除非您的输入是SIZE字节的固定长度记录,否则您将读取多行,完全错过了现在位于缓冲区中间的STOP。

while(fgets(buffer,sizeof(buffer),stdin)&amp;&amp;(strncmp(buffer,“STOP”,4)!= 0))

一次读一行。