Прочитайте документацию от freopen(3). Вы должны проверить и использовать его результат:
freopen()
Функция открывает файл, имя которого является строка указывает path
и связывает поток, на который указывает поток с ним. Исходный поток (если он существует) закрыт.
о возвращаемом значении:
После успешного завершения fopen()
, fdopen()
и freopen()
возвращает указатель на FILE. В противном случае возвращается, NULL
и errno
установлен на указывает на ошибку.
Так что вам нужно закодировать, по крайней мере (если на Linux или какой-либо POSIX системы)
void write_to(int subtask, int tc){
string output =
string("testcases/subtask-") + to_string(subtask)
+ "-tc-" + to_string(tc);
FILE*outf = freopen(output.c_str(), "w", stdout);
if (!outf) {
perror(output.c_str());
char pwdbuf[128];
memset (pwdbuf, 0, sizeof(pwdbuf));
getcwd(pwdbuf, sizeof(pwdbuf)-1);
fprintf(stderr, "failure in %s\n", pwdbuf);
exit(EXIT_FAILURE);
}
}
(код выше, не решит проблему, но будет выводить сообщение об ошибке содержательную на ошибки , может быть, вы не используете свой код в соответствующем текущем каталоге)
Я также рекомендую окончание вашего for
цикла в main
с fflush(stdout)
или fflush(NULL)
.
Если на Linux или POSIX, вы могли бы вместо того, чтобы работать на уровне дескриптора файла (так закодировать перенаправление), а также использовать open(2) & dup(2) (с использованием STDOUT_FILENO
в качестве второго аргумента dup2
).
Если testcases
директория в вашем $HOME
(то есть ~/testcases/
по мере расширения вашей оболочки) вы хотели бы
string output =
string (getenv("HOME")) + "/"
+ string("testcases/subtask-") + to_string(subtask)
+ "-tc-" + to_string(tc);
путь спецификации относительно текущего каталога исполнения не в директории исполняемого находится в. –
Существует ли каталог 'output'? –
@MichaelWalz Да, он уже существует –