2012-02-01 127 views
2

我正在做一個作業任務,我遇到了一個小障礙。統計系統調用報告「沒有這樣的文件或目錄」

我試圖從標準輸入讀取一個文件名,然後stat的文件,以獲得大小(根據任務的要求):

#define BUFFSIZE 4096 

int 
main(void) { 
    int n; 

    char buffer[BUFFSIZE]; 

    struct stat buf; 

    while ((n = read(STDIN_FILENO, buffer, BUFFSIZE)) > 0) { 
     stat(buffer, &buf); 
     perror("stat"); 
    } 
} 

下面是輸出跑的時候(我輸入的文件名file ):

file 
stat: No such file or directory 

但是,如果我嘗試這樣:

#define BUFFSIZE 4096 

int 
main(void) { 
    int n; 

    char buffer[BUFFSIZE] = "file"; 

    struct stat buf; 

    stat(buffer, &buf); 
    perror("stat"); 
} 

我得到:

stat: Success 

名爲file的文件是在我運行從程序的目錄。

爲什麼字符串「file」中的讀取和將數組初始化爲字符串「file」之間存在差異?

回答

4

調用stat()打印buffer值到標準輸出之前:

printf("[%s]\n", buffer); 

它不會是你所期望的,因爲read()不會NULL終止buffer爲你。 在read()之前初始化buffer

不知道爲什麼你在read()上循環,因爲你應該在調用stat()之前獲取文件的完整名稱。如果你還沒有被迫使用read()考慮使用fgets()

3

您是否嘗試打印緩衝區?很可能您的read調用在字符串「file」的末尾返回了一個換行符,並且目錄中沒有文件「file \ n」。我建議使用fgets來代替控制檯讀取文件名。儘可能使用標準C輸入/輸出,並且只有在可衡量的好處時才委託給特定於平臺的代碼(例如,C標準庫中沒有跨平臺的stat函數,有時Unix I/O可以顯着提高性能)。

+0

感謝您的建議,但該任務要求我使用'read'和'stat'。 – amillerrhodes 2012-02-01 23:39:03

3

在第一個片段的緩衝區中有一個'\n'。把它拿出來

buffer[strlen(buffer) - 1] = 0; 
0

read()可能在第一個循環上讀得太多(或者不夠)。嘗試打印出它僅僅是stat()調用之前閱讀:

printf("Read %d characters (%s)\n",n,buf); 

read()可能是這個任務有點低的水平 - 我推薦使用scanf()代替。

while (scanf ("%s",buffer) == 1) { 

對於安全的代碼,你需要指定的字符最多讀取,你可以這樣做:

while (scanf ("%4096s",buffer) == 1) { 

不過,如果你想使用BUFFSIZE宏,你需要做一點mucking about

#define XLIM_PERCENT_S(x) "%" #x "s" 
#define LIM_PERCENT_S(x) XLIM_PERCENT_S(x) 

.... 

while (scanf (LIM_PERCENT_S(BUFFSIZE) , buffer) == 1) { 
2

問題是read在緩衝區中留下換行符,所以您嘗試stat"file\n"

相關問題