2016-12-08 2 views
0

Je suis en train d'écrire des fichiers dans des sous-répertoires à l'aide freopen:Ecrire à l'aide de sous-répertoire freopen

freopen("output/output-1.txt", "w", stdout);

J'ai essayé de changer à la sortie dans le répertoire courant et il fonctionne. Il se termine sans erreur lorsque le fichier de sortie cible est dans un sous-répertoire; Cependant, aucun fichier n'est créé. La création du répertoire requis ne résout pas le problème.

void write_to(int subtask, int tc){ 
    string output = string("testcases/subtask-") + to_string(subtask) + "-tc-" + to_string(tc); 
    freopen(output.c_str(), "w", stdout); 
} 

int main(){ 
    for(int i = 1; i <= 25; i++){ 
     write_to(1, i); 
     // rest of code to generate and cout test cases 
    } 
} 

Quelqu'un at-il une solution à ce problème?

+3

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. –

+1

Le répertoire 'output' existe-t-il déjà? –

+0

@MichaelWalz Oui, il existe déjà –

Répondre

1

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); 
+0

Merci, cela a résolu le problème. L'erreur était Autorisation refusée - l'exécution en tant que root permettait la création des fichiers dans les sous-répertoires. –

+1

Vous ne devriez jamais exécuter en tant que root un programme que vous avez écrit, sauf si vous êtes sûr de ne pas avoir de trou de sécurité. –