簡體   English   中英

尋求問題

[英]lseek issues

我很難弄清楚為什么lseek無法正常工作。 基本上,我所需要做的就是從標准輸入中獲取輸入,將其存儲到名為“ log.txt”的文件中,並在遇到“ STOP”字樣時讓程序停止。

我的問題是,當我嘗試運行該程序時,遇到一個lseek錯誤:非法尋道,我不知道為什么。 我以為問題是對lseek的調用,但是如果我用lseek(fd, atol(0), SEEK_END)替換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);
}
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()成功,它將返回> = 0的值,因此表達式open(...) < 0將為false,因此fd將設置為0。

文件描述符0代表過程的標准輸入。 除非您已將其重定向,否則這將是終端設備,對其進行搜索是非法的。

您正在讀取和寫入同一文件

 read(fd, buffer, SIZE)

是錯的。 您想從stdin閱讀。

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

應該更改為:

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

在某些情況下,lseek可能會提供負偏移。 結果,在測試錯誤時,僅應使用x == -1,而不是x <0。

您不僅在讀取同一文件,而且read()讀取SIZE個字節。 除非您輸入的是SIZE字節的固定長度記錄,否則您將讀取多行,從而完全缺少現在位於緩沖區中間的STOP。

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

一次讀取一行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM