我很难弄清楚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);
}
答案 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))
一次读一行。