2010-09-23 7 views
3

J'essaie de rediriger la sortie d'un programme c vers un fichier, même s'il génère des erreurs en raison de problèmes avec les données d'entrée. Je peux envoyer la sortie mais les messages d'erreur à un fichier.Comment rediriger la sortie d'un programme c vers un fichier?

Quelqu'un sait-il comment le faire?

+2

Ce n'est pas une question de programmation et une réponse correcte est très dépendante de votre environnement. Voter pour passer à superuser.com. –

+2

Pourquoi ce n'est pas une question liée à la programmation ?? Les sorties peuvent être redirigées à partir du code C! – Donotalo

+2

Il devrait revenir à StackOverflow. La réponse avec la plupart des upvotes est liée à la programmation. Rien à voir avec le lot. – BrunoLM

Répondre

3

(Cette réponse s'applique à shell bash et saveurs similaires. Vous ne spécifiait pas votre environnement et ce genre de question a besoin de ce détail.)

Je suppose que vous savez sur la redirection de base avec « > ». Pour capturer également STDERR en plus STDOUT, utilisez la syntaxe suivante:

command > file-name 2>&1 

Pour certains plus d'information sur les flux standard et numéros:

http://en.wikipedia.org/wiki/Standard_streams#Standard_input_.28stdin.29

+0

Je crois que vous devez les faire dans l'autre ordre, comme vous l'avez fait, il mettrait la commande stdout de commande dans le nom de fichier, et la commande stderr de commande dans stdout du pipeline. Aussi, Aldo n'a pas dit qu'il utilisait bash, en fait il n'y a rien dans la question à suggérer. –

+0

La commande est correcte mais vous avez raison sur l'hypothèse de bash. Je vais éditer la réponse. –

7

A partir du code source C, vous pouvez réacheminer les sorties en utilisant freopen():

sorties générales:

freopen("myfile.txt", "w", stdout); 

Erreurs:

freopen("myfile_err.txt", "w", stderr); 
2

Cela dépend de ce que vous entendez et ce que la plate-forme que vous utilisez. Très souvent, vous pouvez accomplir cela à partir de la ligne de commande, qui a été couverte dans une autre réponse. Si vous utilisez cette méthode pour cela, sachez que FILE * stderr est généralement écrit immédiatement (sans tampon) tandis que FILE * stdout peut être mis en mémoire tampon (généralement en ligne) de sorte que certains de vos messages d'erreur semblent avoir été imprimés plus tôt que certains d'autres messages, mais les autres messages sont en train d'être imprimés en retard.

A partir d'un programme C, vous pouvez également faire quelque chose de similaire dans le système en utilisant stdio freopen, qui l'effet FILE *, de sorte que vous pouvez faire imprimer fprintf(stderr, "fungus"); à quelque chose en plus ce que stderr normalement à imprimer. Mais si vous voulez savoir comment rediriger les descripteurs de fichiers réels sous un système de type Unix, vous devez en savoir plus sur les appels système dup et dup2. Ils vous permettent de dupliquer un descripteur de fichier.

int fd = open("some_file", O_WRONLY); 
dup2(2,fd); 
close(fd); 

Ce code fera de "some_file" le nouveau stderr au niveau du système d'exploitation. L'appel dup2 se fermera et remplacera le descripteur de fichier 2 (stderr, qui est habituellement utilisé par FILE * stderr mais pas nécessairement si vous appelez freopen(x,y,stderr) puisque cela peut faire FILE *stderr utiliser un descripteur de fichier différent).

Voici comment les programmes shell redirigent l'entrée et la sortie des programmes. L'ouverture de tous les fichiers dont le nouveau programme aura besoin, fork, puis l'enfant utilise dup2 pour configurer les descripteurs de fichiers pour le nouveau programme, puis il ferme tous les fichiers dont le nouveau programme n'aura pas besoin (en laissant simplement 0, 1, et 2 ouvert), puis utilise l'une des fonctions exec pour devenir le programme que le shell a été dit d'exécuter. (une partie de ceci n'est pas tout à fait exacte parce que certaines coquilles peuvent s'appuyer sur des drapeaux exe proches)

0

En utilisant une simple commande linux, vous pouvez sauvegarder la sortie dans le fichier. Voici une commande linux simple terminal.

ls > file.txt 

La sortie de cette commande sera enregistrée dans le fichier.
même que vous pouvez stocker la sortie du programme comme celui-ci suppose, nom de fichier objet est un, exécutez la commande suivante pour enregistrer la sortie dans un fichier:

./a > file.txt 
Questions connexes