首页
学习
活动
专区
圈层
工具
发布

lseek问题
EN

Stack Overflow用户
提问于 2011-05-21 21:38:00
回答 4查看 5.3K关注 0票数 1

我很难弄清楚为什么lseek不能正常工作。基本上,我需要做的就是从标准输入中获取输入,将其存储到一个名为"log.txt“的文件中,然后让程序在遇到" stop”这个词时停止。

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

我只是太困惑了,我不知道该怎么做才能解决这个问题,希望你能给我一些建议。

代码语言:javascript
复制
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);
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-05-21 21:57:30

代码语言:javascript
复制
if (fd = open("log.txt", O_RDWR, S_IRWXU|S_IRWXG|S_IRWXO) < 0)

应该是

代码语言:javascript
复制
if ((fd = open("log.txt", O_RDWR, S_IRWXU|S_IRWXG|S_IRWXO)) < 0)

否则它将被解析为

代码语言:javascript
复制
if (fd = (open("log.txt", O_RDWR, S_IRWXU|S_IRWXG|S_IRWXO) < 0))

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

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

票数 3
EN

Stack Overflow用户

发布于 2011-05-21 21:42:24

您正在读取和写入相同的文件

代码语言:javascript
复制
 read(fd, buffer, SIZE)

是错误的。您想要从stdin中读取。

票数 3
EN

Stack Overflow用户

发布于 2013-12-11 00:23:42

代码语言:javascript
复制
if ((cur = lseek(fd, 0, SEEK_END)) < 0)

应更改为:

代码语言:javascript
复制
if ((cur = lseek(fd, 0, SEEK_END)) == -1)

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6082083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档