如果fopen
returns NULL
,則打開失敗。 errno
將持有failure code和strerror(errno)
將返回爲什麼打開失敗的簡短說明。
#include <errno.h>
#include <string.h>
...
int main(void)
{ FILE* inFile = NULL;
char infileName[32] = {'\0'};
gather_input(infileName); // infileName is an output parameter for this
if (!(inFile = open_input_file(infileName))) {
fprintf(stderr, "Error opening '%s': %s\n",
infileName, strerror(errno));
} else {
// open successful
...
}
}
題外話
gather_input
更好地確保infileName
是空值終止,以防止緩衝區溢出。最簡單的方法是將文件名緩衝區的大小定義爲宏,並將最後一個字符設置爲0.
#define FILENAMELEN 32
void gather_input(char infileName[]) {
...
infileName[FILENAMELEN-1]=0;
}
int main(void)
{ FILE* inFile = NULL;
char infileName[FILENAMELEN] = {'\0'};
這不是很靈活。您可以改爲將文件名緩衝區的大小傳遞給gather_input
。
#define LENGTH(a) (sizeof(a)/sizeof(a[0]))
void gather_input(char infileName[], size_t len) {
...
infileName[len-1]=0;
}
int main(void)
{ FILE* inFile = NULL;
char infileName[32] = {'\0'};
gather_input(infileName, LENGTH(infileName)); // infileName is an output parameter for this
到設定的最後一個字符,如果使用標準的字符串操作函數的替代,是使用strl*
函數(strlcpy
and strlcat
),而不是其無界表親。如果您沒有使用strl*
,則應該使用strncpy
和strncat
。
我剛剛在gather_input函數中添加了一個錯誤檢查,以確保infileName以null結尾。這似乎並沒有解決問題。我還添加了你的代碼(#included errno.h並添加了if語句),但我不太確定那裏發生了什麼。錯誤消息應該打印在哪裏? – Nate 2010-11-15 06:22:08
空終止事件與您所面臨的問題有關,並且更多地與防止緩衝區溢出有關(請參閱更新後的答案)。 RE:哪裏。如果你是通過命令行在終端中運行它的話。如果你是從調試器運行這個,在控制檯中。 – outis 2010-11-15 06:30:29
這是什麼意思,在終端中,還是在控制檯中?出於某種原因,當我調試時,程序跳過代碼中的if語句。我將代碼發佈到pastebin(http://pastebin.com/Qbrh1v4A)上。儘管我認爲我沒有忽略任何重要的事情,但我有這樣的機會。如果你願意,你可以看一下,我會很感激的,但是如果你不願意,我絕對明白。 – Nate 2010-11-15 06:42:19