2015-03-02 44 views
0

我正在從標準輸入讀取文件名,並且該函數返回的是完全錯誤的內容。下面的代碼返回4294967296,而不是應該是7.我在linux上運行這樣的文件:從stdin查找文件的大小給出的數字不正確

echo「p3test.txt」| ./totalsize

#define _GNU_SOURCE 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <sys/stat.h> 
#include <errno.h> 

//find the file size 
off_t filesize(const char* fileName){ 
    printf("%s", fileName); 

    struct stat st; 
    if(stat(fileName, &st) == 0) 
     printf("%zd", st.st_size); 
     return st.st_size; 


    fprintf(stderr, "Cannot determine size of %s: %s\n", 
     fileName, strerror(errno)); 

    return -1; 

} 

int main (int argc, char *argv[]) 
{ 
    char tmpstring[1024]; 
    const char* fileName; 
    off_t size; 

    while (fgets(tmpstring, 1024, stdin)) 
    { 
    fileName = tmpstring; 
    size = filesize(fileName); 
    } 
} 
+5

您可能缺少一些花括號。 – 5gon12eder 2015-03-02 19:30:23

+0

我不能看到它會在哪裏,它編譯正確,我的支架熒光筆說我的括號很好 – FullCombatBeard 2015-03-02 19:31:59

+0

@FullCombatBeard'if(stat(fileName,&st)== 0)'後面的兩條花線沒有大括號看起來很奇怪。 – myaut 2015-03-02 19:33:53

回答

4

當你使用:

while (fgets(tmpstring, 1024, stdin)) 

你在tmpstring'\n'。在致電filesize之前,從名稱中修剪該字符。

此外,線

if(stat(fileName, &st) == 0) 
    printf("%zd", st.st_size); 
    return st.st_size; 

應該是:

if(stat(fileName, &st) == 0) 
{ 
    printf("%zd", st.st_size); 
    return st.st_size; 
} 

否則,if聲明終止於printf線和你最終返回st.st_size不管stat的返回值。

更新

感謝@chux的意見。格式"%zd"可能不適合用於stat.st_size的類型。您應該使用:

printf("%jd", (intmax_t)st.st_size); 
+0

這就是它,我不知道fgets返回一個新行,謝謝! – FullCombatBeard 2015-03-02 19:38:36

+1

不能確定''z「'是一個完全可移植的說明符,」z「表示'size_t',而'st.st_size'是一些名爲'off_t'的有符號類型。建議'printf(「%lld」,(long long)st.st_size);'或'printf(「%jd」,(intmax_t)st.st_size);'。 – chux 2015-03-02 20:49:31