2014-06-26 34 views
-2

我寫了下面的代碼:文件I/O fopen()函數返回NULL

void WriteToFile(const char** strings, const char* path, int n) 
{ 
    FILE* fp = fopen(path, "w"); 
    int i; 
    if(fp) 
    { 
     for(i = 0 ; i < n ; i++) 
     { 
      puts(strings[i]); 
      fprintf(fp, "%s\n", strings[i]); 
     } 
    } 
    else 
    { 
     printf("Error at writing to file.\n"); 
     exit(1); 
    } 

    fclose(fp); 
} 

我得到一個錯誤 - 過於意味着fopen()沒有工作,怪異,我打印的路徑 - FP指向NULL它沒有\n或其中的奇怪的東西,它可以在我的電腦中。

+0

你對文件有寫權限嗎?使用調試器,複製路徑並將其粘貼到記事本的「打開」對話框中,查看記事本是否可以找到複製粘貼的路徑。 –

+1

[fopen set errno upon failure](http://linux.die.net/man/3/fopen),失敗後errno設置了什麼?使用[strerror](http://linux.die.net/man/3/strerror)作爲錯誤字符串的文本版本。 – fvu

+0

你是否試圖無權限寫入文件夾? – BLUEPIXY

回答

2

如果你不知道爲什麼fopen失敗,讓計算機來告訴你:

fp = fopen(path, "w"); 
if(fp == NULL) { 
    perror(path); 
    exit(1); /* Or handle error some other way */ 
} 

錯誤信息屬於stderr上,而不是標準輸出。切勿使用printf編寫錯誤消息(改用fprintf(stderr, ...)。 perror不僅將錯誤消息打印到正確的位置,還會告訴您問題是什麼。

+0

出於好奇,我總是被告知與stderr相同的事情,但默認情況下不是stderr和stdout同樣的事情(即它們都輸出到控制檯)?除非你明確地將stderr和stdout設置爲其他的東西,否則它應該沒關係,對吧? – wolfPack88

+0

@ wolfPack88由最終用戶決定。如果他們將stderr提供給默認tty以外的其他地方,他們希望在那裏看到你的錯誤,並且不會在他們試圖篩選的正常輸出之間出現問題。 – Quentin

+0

考慮通過grep運行某些命令的輸出的情況:'sort foo | grep酒吧'。如果排序無法打開文件foo並將錯誤寫入標準輸出,則(除非錯誤消息包含字符串「bar」),則錯誤消息將被抑制。 –