我有以下代碼打開了一個輸入和輸出文件:奇怪ç行爲具有的fopen和測試NULL
if ((source_file_ptr = fopen(source_filename, "rb")) == NULL) {
error("unable to open input file");
}
if ((output_file_ptr = fopen(output_filename, "wb")) == NULL) {
error("unable to open output file");
}
這是goood簡單的辦法趕上在打開的文件中的錯誤。
但是,在對我的程序進行一些編輯後,程序現在崩潰而不是捕獲無效的輸出文件。
我試了幾件事情沒有成功,但有趣的是,當我試試這個:
if ((output_file_ptr = fopen(output_filename, "wb")) == NULL) printf("fail");
exit(0);
if ((source_file_ptr = fopen(source_filename, "rb")) == NULL) {
error("unable to open input file");
}
if ((output_file_ptr = fopen(output_filename, "wb")) == NULL) {
error("unable to open output file");
}
這將打印「失敗」(顯然退出而不更加深入瞭解)。
但是,如果我將exit(0)行註釋掉,它將再次顯示相同的崩潰行爲,而不打印「失敗」,也不會捕獲錯誤。
我無法解釋爲什麼這是...我懷疑是一個懸掛指針,但函數內的唯一前面的代碼行已經包含在if-else if-else all with括號中。上面只有其他幾個函數,但我已經檢查並確保它們都被括在括號內。
我還在學習C,關於這裏發生了什麼的任何想法?
非常感謝!
注意:用括號括住printf(「fail」)不會改變我觀察到的行爲。
編輯:額外的代碼如下上面:
if (fread(&file_struct, sizeof(file_struct), 1, source_file_ptr) < 1) {
error("unable to read %s", source_filename);
}
else {
error_check(file_struct);
if (fwrite(&file_struct, sizeof(file_struct), 1, output_file_ptr) < 1) {
error("unable to write file header");
}
}
你可以在這些if後面發佈後續代碼嗎?如果遇到故障,這些'if's將打印消息,但文件指針仍可能被使用。 – hmjd 2012-03-29 11:11:49
使用'perror()'來描述錯誤。 – pmg 2012-03-29 11:14:48
您可能需要在printf()和exit()周圍使用一些{}。 – wildplasser 2012-03-29 11:15:11