2009-11-04 10 views
7

musiałem naprzód stdout do różnych plików, aby oddzielić pewne wydruki wyprodukowane i wracając do normalnego standardowe wyjście.freopen: wracając do pierwotnego strumienia

użyłem freopen, aby przejść do pliku w ten sposób:

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

I to faktycznie działa, ale pod koniec procesu (umysł stdout jest przekierowywany wiele razy w poprzednim samo) I "Nie mogę przywrócić oryginalnego stdout. Próbowałem następujące:

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

ale nie wydaje się działać .. tylko dla informacji rozwijam na macosx.

Co należy zrobić?

góry dzięki

+0

Możesz chcieć dodać więcej szczegółów, co się stanie, gdy wykonasz ostatnie freopen()? Czy zwraca NULL? – unwind

Odpowiedz

11

Można to osiągnąć za pomocą wywołań feleno, dup i dup2. Próbowałem tego na Linuksie, nie wiedząc, czy to zadziała na Macu, ale jestem pewien, że dostaniesz ekwiwalentne funkcje dla twojej instalacji. Sprawdź, czy ten przykładowy kod działa dla Ciebie. Przepraszamy za brak obsługi błędów w kodzie. :)

#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()"); 
    } 
+0

Działa również na OS X. – laalto

+0

@laalto Gr8, dziękuję za wejście. –

+1

Modyfikowanie tego na #include , a następnie sprawdzanie wartości zwracanych w wywołaniach fgetpos/fsetpos pokazuje problemy w systemie Linux: if (fgetpos (stdout, & pos)) perror ("fgetpos"); –

-1

Wydaje się to okrężny sposób rozwiązywania problemu. Dlaczego nie po prostu otworzyć każdy plik z fopen() a następnie pisemnie do jego FILE * z fputs, fprintf, fwrite itp? Nie ma potrzeby przekierowania standardowego wyjścia.

+2

Prawdopodobnie dlatego, że kod (dużo) jest zapisywany bez określania strumienia wyjściowego, np. używając tylko zwykłych wywołań printf(). Przekierowanie standardowe jest sposobem na "zawijanie" tego kodu i zapisywanie go w żądanym miejscu, bez zmieniania go. Tylko zgaduję, oczywiście. – unwind

+1

@ guź się zgadnij, jest to najbardziej prawdopodobny przypadek użycia freopen. –

+0

Mogę faktycznie potwierdzić, że to jest powód. Jest to kompilator i zawsze używałem printf do drukowania kodu asm (np. MOV $ 1, 4.5f) podczas tworzenia go i teraz nie chcę tracić czasu na zastępowanie rzeczy .. – Jack

Powiązane problemy