2011-02-16 61 views
1

我正在嘗試寫入文件並向其中追加數據。fopen沒有打開文件流......我該如何解決這個問題?

這是我的代碼片段。 thresh是一個未簽名的短。

FILE *fp_th; 
    fp_th = fopen("threshold.txt", "a"); 
    printf("opening file failed: %s\n", strerror(errno)); 
fprintf(fp_th,"%d ", thresh); 
    fclose(fp_th); 

在它工作正常之前,我已經更改了一些代碼,並且突然間它不再打印出來。

我已確認的fopen不與

printf(" check fp_th = %p \n", fp_th); 

它打印出check fp_th = 00000000打開一個文件流。

編輯:fopen後添加printf("opening file failed: %s\n", strerror(errno));。輸出說沒有錯誤。它在說謊嗎?奇怪..

奇怪的是我正在寫和附加一個類似的文件,但該文件工作正常。你如何解決一個返回NULL的fopen?爲什麼會發生?謝謝!

+0

你改變了什麼代碼? – 2011-02-16 20:39:17

+0

我的計劃中的東西應該不重要,我會想。你們這些人只需要知道我在寫什麼,這是我的可變門檻,一個未簽名的短文。 fprintf處於一個循環中。然而,fopen在這個循環之前很多。我的threshold.txt永遠不會被創建。有任何想法嗎? – 2011-02-16 20:44:38

+4

「我的程序中的東西應該不重要」着名的遺言。 – 2011-02-16 22:23:11

回答

5

首先

fprintf(fp_th,"%d ", thresh); 

通常緩衝輸出,直到您關閉文件,或內部文件*緩衝區已滿。您可能不會立即在文件中看到任何輸出

您可以fflush()FILE *在您決定時將它寫出到文件中。

fprintf(fp_th,"%d ", thresh); 
fflush(fp_th); 

其次

printf(" check fp_th = %d \n", fp_th); 

這並不檢查fp_th是無效的。它只是將fp_th的指針值打印爲一個有符號的整數,-7323824可能與任何值一樣好,如果指針的大小與大小不一致一個int。

要打印的指針,你應該使用%P

printf(" check fp_th = %p \n", fp_th); 

的fopen返回NULL,如果失敗的話,你應該檢查是學習,如果打開文件失敗與否。

FILE *fp_th; 
fp_th = fopen("threshold.txt", "a"); 
if(fp_th == NULL) { 
    printf("opening file failed: %s\n", strerror(errno)); 
    return; 
} 
0

之前,它一直很好,但我已經改變了我的一些代碼,突然不打印出來了的。

如果您的代碼更改了當前的工作目錄,則可能導致文件找不到,因爲您沒有提供完整的路徑。在這種情況下,fp_th應該是一個空指針,這是你可以檢查的東西。您的打印信息表明它沒有返回空指針,而是打開了文件。有關詳情,請參閱fopen

3

首先,總是檢查返回值爲fopen爲NULL,這意味着失敗。

要了解文件打開期間出錯的情況,您可以使用perror

if (fp_th == NULL) { 
    perror ("Error opening threshold file"); 
    exit(EXIT_FAILURE); 
    } 

如果仍然無法弄清楚,而你得到permission deniedNo such file or directory,您可以使用strace(假設Linux的),並尋找相應的系統調用。

0

今天我有類似的問題。我的代碼是打開N-1文件,但神祕地墜毀在第N個文件,雖然該文件肯定存在...雖然該文件絕對存在...

perror透露,我實際上從來沒有關閉所有這些文件 - 對我的尷尬,我忘了fclose(fd) ...

到目前爲止,我沒有使用perror,但我現在意識到它有多寶貴。 :)

相關問題