2011-02-25 75 views
2

我想解析給定的文本文件,但到目前爲止,我的程序似乎沒有正確讀取。從作爲命令行爭論傳遞的文件中讀取

#include <stdio.h> 


int main(int argc, char *argv[]) 
{ 
    FILE *fr; //file pointer 
    int buildingFloors = 1; 

    printf("sanity check\n"); 

    fr = fopen (argv[0], "r"); 
    fscanf(fr, "%d", &buildingFloors); 

    printf("%d\n", buildingFloors); 

    fclose(fr); 

    return 0; 
} 

我編譯程序和我的紅帽的Linux機器上,使用下列命令運行它:

./sjf file.text 

file.text是一個「4」文本文檔作爲第一個字符。所以,我希望我的輸出是

sanity check 
4 

然而,當我運行我的程序,而不是我得到

sanity check 
1 

這意味着的fscanf沒中第一個字符正確讀取 - 4.是否我有一些語法錯誤會阻止預期的代碼功能?我應該掃描一個字符,然後將其轉換爲int嗎?這立刻想到

回答

4

的一件事是,該方案ARGS包括可執行文件名作爲第一個元素

argv[0]是「水井坊」

argv[1]是「file.text」

所以你應該使用

fr = fopen (argv[1], "r"); 

記住,當調試總是嘗試和縮小問題,如果你知道e錯誤的位置原因通常變得明顯或至少可以調查。

在這種情況下,您應該檢查argc >= 2,打印出argv[1]以確保您嘗試打開正確的文件,然後檢查文件是否已成功打開。

最後檢查fscanf錯誤代碼,看看fscanf是否能夠讀取該數字。

+3

他必須檢查'argc == 2'是否也是。 – 2011-02-25 22:22:15

+0

@Blagovest Buyukliev:非常真實,我會將其添加到答案中 – Akusete 2011-02-28 20:05:29

5

argv[0]是該程序的名稱(您的情況爲./sjf),因此您正嘗試讀取自己程序的可執行文件。使用argv[1]來獲得第一個真正的程序參數。

0

您的代碼看起來很清晰直截了當,但有一個重要的缺失:錯誤處理。

如果要打開的文件不存在,會發生什麼情況?在這種情況下,fopen返回NULL。

如果文件不是以數字開頭會發生什麼? fscanf返回已成功讀取的字段數,因此您應該檢查返回值是否至少爲1.

您需要以某種方式處理這些情況,可能是通過打印某些錯誤消息並退出程序。當你這樣做時,一定要在錯誤信息中包含相關信息。然後你會發現其他答案已經提到的錯誤。

相關問題