У меня есть следующий код для открытия файла ввода и вывода:
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");
}
Это простой способ отловить ошибки при открытии файлов.
Однако после некоторого общего редактированиямоя программа, программа теперь падает, вместо того, чтобы перехватить неверный выходной файл.
Я попробовал несколько вещей без успеха, но интересно, когда я попробую это:
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");
}
Будет напечатано «сбой»(и, очевидно, выйти без особого понимания).
Но если я закомментирую строку выхода (0), он снова будет демонстрировать то же поведение при сбое, не печатая «fail» и не перехватывая ошибку.
Я не могу объяснить, почему это так ... Я подозревал свисающий указатель, но единственные предшествующие строки кода внутри функции уже заключены в if-else if-else, все с фигурными скобками.Есть только несколько других функций, описанных выше, но я проверил и убедился, что все они заключены в фигурные скобки.
Я все еще изучаю 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");
}
}