2016-11-27 1 views
1

Ich möchte STDOUT in eine Datei auf der Festplatte umleiten. Der Punkt ist, dass printf in meinem Programm in eine Datei statt in die Konsole schreibt.fclose (stdout) vs schließen (STDOUT_FILENO) - C

ich einige Artikel im Web gesehen, wo sie gebraucht:

dup2(fileno(outputFile), STDOUT_FILENO); 

Oder:

close(STDOUT_FILENO); 
dup(fileno(outputFile)); 

In jedem Tutorial sie in der Nähe() und es tatsächlich funktioniert. Aber ich war neugierig, und ich versuchte, fclose (stdout) stattdessen zu verwenden, aber einige Fehler passiert ist, als ich versuchte, printf zu verwenden:

fclose(STDOUT_FILENO); 
dup(fileno(outputFile)); 

Fehler:

Bad file descriptor 

Meine Frage ist, warum tut fclose() nicht funktionieren, aber schließen()?

Danke.

+0

Wenn Sie stdout nur in eine Datei umleiten möchten, verwenden Sie eine Shellumleitung. Wenn Sie erfahren möchten, wie Sie eine Datei mit C umleiten, sollten Sie die Frage neu formulieren. –

Antwort

3

STDOUT_FILENO ist ein numerischer Dateideskriptor (normalerweise 1). Wenn Sie close verwenden, geben Sie den Deskriptor frei, weisen ihn dann jedoch erneut dup2 zu. Jede Ausgabe zu diesem Deskriptor wird nun zu der neuen Datei gehen.

stdout auf der anderen Seite ist ein FILE*, ein Objekt der Art, die einen Dateideskriptor enthält. Doing printf Formate Ausgabe in einen Puffer mit der FILE verbunden, und dann write s den Puffer zum Deskriptor (abhängig von der Pufferungsmodus). Wenn Sie fclose a FILE*, es (normalerweise) close s zugrunde liegenden Deskriptor, und gibt die FILE Objekt. Die dup2 gibt stdout nicht zurück, so dass printf fehlschlägt.