2012-07-28 40 views
0

我編寫了一個程序,它將文件名作爲參數,打開文件,解析其內容並執行一些操作。我正在編寫一個測試程序,通過執行它來測試該程序。使用Execl執行我的程序

這裏是我的測試類:

int main() { 

    FILE *input; 
    input = fopen("file.txt", "w+"); 
    if (input == NULL) { 
    fprintf(stderr, "Unable to create a new file"); 
    exit(1); 
    } 

    fprintf(input, "8\n"); 

    if (execl("./a.out", "./a.out", "file.txt", NULL) == -1) { 
    fprintf(stderr, "Error forking program\n"); 
    exit(1); 
    } 

    return 0; 
} 

當我打開file.txt,我只看到一個空白文件。我的./a.out程序正在發出解析錯誤(fgets正在返回NULL),並且我假設它因爲file.txt未被寫入。這裏有什麼問題?我怎樣才能調試這樣的問題?爲什麼fprintf永遠不會寫入文件?

謝謝

回答

3

您需要刷新文件 - 請參閱fflush。在POSIX系統上,如果要在每個printf上刷新,也可以使用setbuf或setvbuf。

編輯:其實,在你的代碼中,要做的恰當的事情就是在execl之前簡單地將文件關閉;這當然會沖洗它。另外,您不需要「w +」,「輸入」對於您正在寫入的文件而言不是一個很好的名稱。

此外,你應該適當地命名你的程序,而不是把它們命名爲a.out;由於您不知道正在運行哪個程序,因此a.out的execl特別危險。如果你編譯上面的程序時沒有-o標誌,它會覆蓋a.out並調用它會導致自身的遞歸執行,導致無限循環。幸運的是,它不會讓您的系統氾濫,因爲您沒有執行分支,這與您的(錯誤的)錯誤消息相反。

尼特:不要忘記用\ n結束您的printfs第一個缺乏。在錯誤信息中特別謹慎,這些信息沒有經過徹底的測試。

+0

謝謝!爲什麼'fopen(argv [1],「r」)'現在在我的程序中失敗了? – darksky 2012-07-28 00:55:55

+0

我不能說,因爲該行不在您發佈的代碼中。 – 2012-07-28 01:05:36

+0

爲什麼我需要在使用'a +'打開的文件上使用'rewind'? – darksky 2012-07-28 11:00:57

1

你要什麼沒有明確specified.But我想你用./a.out這是本program.Then

第一個問題的同一圖像是你有一個命令行參數沒有安排。

第二個問題是使用

fopen("test.txt","w+"); 

//打開文件,如果存在,截斷它。如果不存在,那麼創建它

也就是說它始終是一個新鮮的file.no以前的內容可用的。如果你想以前的文件內容也然後使用

fopen("test.txt","a"); 

從文件中讀取,也可以使用

fopen("test.txt", "a+"); 

您還將有當a+被使用,並且該文件已經存在調用rewind()上的文件。

第三個問題你用另一個圖像替換當前圖像,所以像recursion.and一樣工作,沒有適當的文件關閉維護,所以有時超出緩衝區沒有適當刷新。

這就像無限循環這樣的工作。那麼它有什麼用處呢我不建議這個程序去做。

+0

謝謝!我編輯了你的答案 - 我添加了一些我剛發現的東西。兩個答案都是對的。我會標記哪一個是正確的? – darksky 2012-07-28 10:58:30

+0

@Darksky你以前接受了我的回答,這回答了你的問題,你說這是有效的。你的問題中沒有什麼關於打開追加等等。如果您還有其他問題,則應該發佈它們,而不是在評論中進行擴展討論。 – 2012-07-28 18:54:45