9 Stimmen

freopen: Zurückkehren zum ursprünglichen Stream

Ich musste stdout an verschiedene Dateien weiterleiten, um einige Ausdrucke und die Rückkehr zu normalem stdout zu trennen.

Ich benutzte freopen um auf diese Weise zur Datei zu wechseln:

char name[80];
memset(name, 0, 80);
strcpy(name, "./scripts/asm/");
strcat(name, m_func->m_name->m_value);
strcat(name, ".shasm");
freopen(name, "w", stdout);

Und es funktioniert tatsächlich, aber am Ende des Prozesses (beachten Sie, dass stdout viele Male in der vorherigen gleichen Weise umgeleitet wird) Ich bin nicht in der Lage, es zu ursprünglichen stdout zurückkehren. Ich habe das Folgende versucht:

freopen("/dev/stdout", "w", stdout);

aber es scheint nicht zu funktionieren.. nur zur Information ich entwickle auf macosx.

Was sollte ich tun?

Vielen Dank im Voraus

13voto

Vinit Dhatrak Punkte 6454

Dies kann mit den Aufrufen fileno, dup und dup2 erreicht werden. Ich habe dies unter Linux ausprobiert, bin mir aber nicht sicher, ob es auch unter Mac funktioniert, aber ich bin mir sicher, dass Sie einige äquivalente Funktionen für Ihr Setup bekommen. Sehen Sie, ob dieser Beispielcode für Sie funktioniert. Entschuldigung für die fehlende Fehlerbehandlung im Code :)

    #include <stdio.h>

    main()
    {
        int    fd;
        fpos_t pos;

        printf("stdout, ");

        fflush(stdout);
        fgetpos(stdout, &pos);
        fd = dup(fileno(stdout));
        freopen("stdout.out", "w", stdout);

        f();

        fflush(stdout);
        dup2(fd, fileno(stdout));
        close(fd);
        clearerr(stdout);
        fsetpos(stdout, &pos);        /* for C9X */

        printf("stdout again\n");
    }

    f()
    {
    printf("stdout in f()");
    }

-1voto

Nick Meyer Punkte 37405

Dies scheint ein Umweg zu sein, um Ihr Problem zu lösen. Warum öffnen Sie nicht einfach jede Datei mit fopen() und schreibt dann in seine FILE * con fputs , fprintf , fwrite usw.? Es ist nicht nötig, stdout umzuleiten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X