[英]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.