2013-04-12 43 views
0

我想開發一個概念驗證程序,打開一個文件,讀取一些數據並關閉它,都不使用fopen/getc/fclose函數。相反,我現在用的是低級別打開/讀取/關閉等價物,但沒有運氣:我不能使打開/讀取/關閉低級別的功能,在Ubuntu中工作

#include <stdio.h> 
#include <stdlib.h> 
#include <stdint.h> 
#include <unistd.h> 
#include <fcntl.h> 
#include <sys/types.h> 

int main (int argc, char **argv) { 

    int fp; 

    ssize_t num_bytes; 

    if (fp = open ("test.txt", O_RDONLY) < 0) { 
      perror("Error opening file"); 
      return 1; 
    } 

    char header[2]; 

    while (num_bytes = read (fp, &header, 2) > 0) 
      printf("read %i bytes\n", num_bytes); 

    printf("done reading\n"); 

    close (fp); 

    return 0; 
} 

如果不存在文件,打開正確打印錯誤消息。另一方面,如果文件存在,則程序將停止在read()函數中,原因不明。對此有何幫助?

回答

6

這是不正確由於operator precedence

if (fp = open ("test.txt", O_RDONLY) < 0) 

作爲=具有比<一個優先級低。這意味着fp將被分配01,這取決於open ("test.txt", O_RDONLY) < 0的結果。

  • 當文件不存在的條件是-1 < 0,其結果是1fp分配1並進入if分支。
  • 當確實存在的條件的文件是N < 0(其中N將大於2,由於stdinstdoutstderr佔據文件描述符012)和fp分配0並沒有輸入if分支。然後該程序繼續到read()行,但fp的值爲0,這是stdin,因此它在等待從stdin讀取某些內容時停頓。

更改爲:

if ((fp = open ("test.txt", O_RDONLY)) < 0) 

同樣的問題在這裏:

while (num_bytes = read (fp, &header, 2) > 0) 
+1

很明顯,我應該更加緊密地檢查通過-Wall什麼GCC報告開關 – charis

1

更改此:

while (num_bytes = read (fp, &header, 2) > 0) 

while ((num_bytes = read (fp, &header, 2)) > 0) 
0

「<」或>」由具有優先於‘=’

所以比較的結果,這將是要麼‘’0' 或‘1’將被指派給FP。

修改類似下面的代碼,

IF((FP =打開( 「test.txt的」,O_RDONLY))< 0)