2013-05-07 16 views
24

Un programma che scrive su "stdout" scrive su un file? lo schermo? Non capisco cosa significa scrivere su stdout.Cosa significa scrivere su stdout in C?

+1

Significa che scrive nel descrittore di file 1. 'stdout' è come un nome di variabile costante, qualcosa che tutti usano in modo da non avere per ricordare che il numero FD attuale è 1. Ad esempio, quando ho scritto per la prima volta, ho pensato che fosse FD 0 ... :) – CivFan

risposta

41

Ciò significa che si sta stampando l'output sul dispositivo di uscita principale per la sessione ... qualunque cosa sia. La console dell'utente, una sessione tty, un file o chissà cosa. Quello che il dispositivo può essere varia a seconda di come viene eseguito il programma e da dove.

Il seguente comando scriverà al dispositivo di output standard (stdout) ...

printf("hello world\n"); 

Che è solo un altro modo, in sostanza, di fare questo ...

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

In quale caso stdout è un puntatore a un flusso FILE che rappresenta il dispositivo di output predefinito per l'applicazione. Si potrebbe anche usare

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

nel qual caso si sarebbe inviare l'output al dispositivo di output di errore standard per l'applicazione che può, o non può, essere lo stesso stdout - come con stdout, stderr è un puntatore a un flusso FILE che rappresenta il dispositivo di output predefinito per i messaggi di errore.

+0

Esiste un esempio in C del comando per scrivere su stdout? Una semplice istruzione printf scrive su stdout? Che ne dici di scrivere su un file con write()? – user2227422

+2

'printf' per scritture di default su' stdout', se vuoi scrivere su un flusso specifico dovresti usare 'fprintf' che accetta un' FILE * 'come flusso di destinazione. – Jack

+1

vedi le mie modifiche ... speriamo che ti aiutino a chiarire per te –

2

stdout sta per flusso di uscita standard ed è un flusso disponibile per il programma dal sistema operativo stesso. È già disponibile per il programma dall'inizio insieme a stdin e stderr.

Ciò che indicano (o da) può essere qualsiasi cosa, in realtà lo stream fornisce al proprio programma solo un oggetto che può essere utilizzato come interfaccia per inviare o recuperare dati. Di default è di solito il terminale ma può essere reindirizzato dove vuoi: un file, un goint pipe in un altro processo e così via.

1

stdout è lo stream di file di output standard. Ovviamente, è il primo e il puntatore predefinito per l'output è lo schermo, tuttavia è possibile puntarlo su un file come desiderato!

Si prega di leggere:

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

C++ è molto simile a C tuttavia, orientato agli oggetti.

9

Dipende.

Quando ci si impegna a inviare l'output a stdout, in pratica si sta lasciando all'utente decidere in quale direzione andare.

Se si utilizza printf(...) (o l'equivalente fprintf(stdout, ...)), si sta inviando l'output a stdout, ma dove che finisce di fatto può dipendere da come invoco il vostro programma.

Se io lancio il programma dalla mia console come questo, ci vediamo in uscita sulla mia console:

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

Tuttavia, mi permetto di lanciare il programma come questo, producendo alcuna uscita sulla console:

ma ora avrò un file "ciao.txt" con il testo "Ciao, Mondo!" all'interno, grazie alla funzione di reindirizzamento della shell.

Chi lo sa - potrei anche collegare un altro dispositivo e l'uscita potrebbe andare lì. Il punto è che quando decidi di stampare su stdout (ad esempio usando printf()), non saprai esattamente dove andrà finché non vedrai come il processo viene lanciato o utilizzato.

0

@K Scott Piel ha scritto un great answer here, ma voglio aggiungere un punto importante.

nota che il flusso stdout è usually line-buffered, in modo da garantire l'uscita è in realtà stampato e non appena lasciato seduto nel buffer in attesa di essere scritti si necessario svuotare il buffer da una terminando la sua dichiarazione printf con un \n

Es:

printf("hello world\n"); 

o

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

o simile, O è necessario chiamare fflush(stdout); dopo la chiamata printf.

Es:

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

Per saperne di più qui: Why does printf not flush after the call unless a newline is in the format string?