Проблема заключается в том, что при неправильном пути к выходному файлу программа просто создаст отсутствующий выходной файл вместо возврата NULL
Это документированное поведение для открытия файла в режиме w
(или любом другом режиме, основанном на w
или a
). Если это не то, что вы хотите - и вы должны подумать, так ли это на самом деле - тогда вам нужно использовать другой режим, по крайней мере, на начальном этапе. Все режимы r
вызывают сбой fopen()
и freopen
, если файл еще не существует, как вы и просили. Некоторые из них открывают файл способом, который разрешает как чтение, так и запись, например,
if (argc == 3) {
if (!freopen(argv[2], "r+", stdout)) {
perror("Path of output file is Invalid");
return EXIT_FAILURE;
}
}
Если вы хотите убедиться, что режим stdout
не разрешает запись, и / или если вы хотите убедиться, что целевой файл урезан, даже если в него ничего не записано, вы можете открыть его дважды , сначала в режиме чтения и, если это удастся, в режиме только записи. :
if (argc == 3) {
if (!freopen(argv[2], "r+", stdout)) {
perror("freopen (output)");
return EXIT_FAILURE;
}
if (!freopen(NULL, "w", stdout)) {
perror("freopen (output)");
return EXIT_FAILURE;
}
}