2013-05-07 14 views
24

Czy program zapisujący do "stdout" zapisuje do pliku? ekran? Nie rozumiem, co to znaczy pisać na stdout.Co to znaczy pisać na stdout w C?

+1

Oznacza to, że pisze do pliku deskryptora 1. 'stdout' jest niczym stałym nazwy zmiennej, coś, że każdy używa więc nie masz aby pamiętać, że aktualny numer FD to 1. Na przykład, kiedy po raz pierwszy to napisałem, myślałem, że to FD 0 ... :) – CivFan

Odpowiedz

41

Oznacza to, że drukujesz dane wyjściowe na głównym urządzeniu wyjściowym sesji ... cokolwiek to może być. Konsola użytkownika, sesja tty, plik lub kto wie co. To, które urządzenie może być różne, zależy od tego, w jaki sposób program jest uruchamiany i skąd pochodzi.

Następujące polecenie wypisze na standardowe urządzenie wyjścia (stdout) ...

printf("hello world\n"); 

który jest po prostu inny sposób, w istocie, w ten sposób ...

fprintf(stdout, "hello world\n"); 

W w tym przypadku stdout jest wskaźnikiem do strumienia FILE, który reprezentuje domyślne urządzenie wyjściowe dla aplikacji. Można również użyć

fprintf(stderr, "that didn't go well\n"); 

w takim przypadku można byłoby wysyłanie wyjście do standardowego urządzenia wyjściowego błędu dla aplikacji, które mogą lub nie mogą być takie same jak stdout - jak z stdout, stderr jest wskaźnik do strumienia FILE reprezentujący domyślne urządzenie wyjściowe dla komunikatów o błędach.

+0

Czy istnieje przykład w C polecenia, aby napisać do stdout? Czy proste polecenie printf pisze na stdout? A co z pisaniem do pliku z write()? – user2227422

+2

'printf' domyślnie zapisuje na' stdout', jeśli chcesz pisać do określonego strumienia powinieneś użyć 'fprintf', który akceptuje' FILE * 'jako strumień docelowy. – Jack

+1

Zobacz moje edycje ... mam nadzieję, że pomogą ci wyjaśnić dla ciebie –

2

stdout oznacza standardowy strumień wyjściowy i jest to strumień, który jest dostępny dla twojego programu przez sam system operacyjny. Jest już dostępny w Twoim programie od początku razem z stdin i stderr.

To, do czego wskazują (lub od) może być cokolwiek, w rzeczywistości strumień zapewnia programowi obiekt, który może być używany jako interfejs do wysyłania lub pobierania danych. Domyślnie jest to zwykle terminal, ale można go przekierować, gdziekolwiek chcesz: plik, procesor do innego procesu i tak dalej.

1

stdout jest standardowym strumieniem pliku wyjściowego. Oczywiście, pierwszym i domyślnym wskaźnikiem do wyjścia jest ekran, ale możesz wskazać plik jako pożądany!

Proszę przeczytać:

http://www.cplusplus.com/reference/cstdio/stdout/

C++ jest bardzo podobny do C jednak obiektowego.

9

To zależy.

Po zatwierdzeniu wysyłania danych wyjściowych do stdout, zasadniczo pozostawiasz to użytkownikowi, aby zdecydować, gdzie powinien on trafić.

Jeśli używasz printf(...) (lub równowartość fprintf(stdout, ...)), wysyłasz wyjście do stdout, ale jeżeli rzeczywiście kończy się może zależeć od tego, jak ja powołać swój program.

Gdybym uruchomić program z mojego konsoli jak ta, to widzę wyjście na konsolę:

$ prog 
Hello, World! # <-- output is here on my console 

Jednak mogę uruchomić program tak, produkując nie ma wyjścia na konsoli:

$ prog > hello.txt 

, ale mam teraz plik "hello.txt" z tekstem "Hello, World!" wewnątrz, dzięki funkcji przekierowania powłoki.

Kto wie - może nawet podłączę jakieś inne urządzenie i wyjście może tam dotrzeć. Chodzi o to, że kiedy zdecydujesz się drukować na numer stdout (np. Za pomocą printf()), nie będziesz dokładnie wiedzieć, gdzie to będzie, dopóki nie zobaczysz, jak proces jest uruchamiany lub używany.

0

@K Scott Piel napisał great answer here, ale chcę dodać jeden ważny punkt.

Należy zauważyć, że strumień stdout jest usually line-buffered, tak aby upewnić się, że wyjście jest faktycznie wydrukowane i nie tylko w lewo siedzi w buforze czeka na pisemne ty musi opróżnić bufor albo przez kończąc swoje oświadczenie printf z \n

Ex:

printf("hello world\n"); 

lub

printf("hello world"); 
printf("\n"); 

lub podobna, LUB musisz zadzwonić pod numer fflush(stdout); po rozmowie printf.

Ex:

printf("hello world"); 
fflush(stdout); 

Czytaj więcej tutaj: Why does printf not flush after the call unless a newline is in the format string?