Lire la documentation de freopen(3). Vous devez tester et utiliser son résultat:
La fonction freopen()
ouvre le fichier dont le nom est la chaîne pointée par path
et associe le flux pointé par stream avec elle. Le flux d'origine (s'il existe) est fermé.
quant à sa valeur de retour:
Après avoir réussi fopen()
, fdopen()
et freopen()
retourner un pointeur FILE. Sinon, NULL
est renvoyé et errno
est défini sur indique l'erreur.
Vous avez donc besoin de coder au moins (si sous Linux ou un système 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);
}
}
(le code ci-dessus ne résoudra pas votre problème, mais affichera un message d'erreur significatif en cas d'erreur , peut-être que vous ne gérez pas votre code dans le répertoire courant approprié)
Je recommande également mettre fin à votre boucle for
en main
avec fflush(stdout)
ou fflush(NULL)
.
Si sous Linux ou Posix, vous pourriez travailler plutôt au niveau du descripteur de fichier (code pour une redirection), et utiliser open(2) & dup(2) (en utilisant STDOUT_FILENO
comme second argument à dup2
).
Si testcases
est un répertoire dans votre $HOME
(c'est ~/testcases/
tel qu'étendu par votre shell) que vous voulez
string output =
string (getenv("HOME")) + "/"
+ string("testcases/subtask-") + to_string(subtask)
+ "-tc-" + to_string(tc);
la spécification de chemin est par rapport au répertoire courant de l'exécution non dans le répertoire de l'exécutable est dans. –
Le répertoire 'output' existe-t-il déjà? –
@MichaelWalz Oui, il existe déjà –