Domanda

Ho un programma di Windows C ++ che sta facendo qualcosa di simile a:

  FILE* pf = ...;
  *stdout = *pf;    // stdout is defined in stdio.h

Sto cercando una spiegazione di ciò che accade quando si modifica il valore della maniglia di file stdout. Questo è solo un modo di reindirizzare stdout?

-CR

È stato utile?

Soluzione

Se si cambia stdout mediante cessione anziché mediante lo strumento designato (in C, freopen() come Adam Rosenfield ha detto - e per estensione, in C ++), poi si lascia te aperto a tutti i tipi di passività

.
  • Non è chiaro che cout sarà anche reindirizzato.
  • È probabile perdere un descrittore di file (che non può importa).
  • Non si potrebbe lavare la stdout originale correttamente -. Perdere informazioni
  • Si potrebbe perdita di memoria associata con il puntatore del file originale (che ancora una volta può non importa).
  • Se non altro si chiude pf, allora siete responsabili per gli errori di doppio libero (crash).

E 'di gran lunga migliore per fare il lavoro in modo pulito.

(codice Demo non è necessariamente scritto da, o anche esaminato da, le persone con più esperienza nella squadra di codifica di un fornitore. Se sembra dubbia, che può essere, perché è dubbia.)

Altri suggerimenti

Sì, quando si cambia stdout, si sta effettivamente reindirizzando altrove. Tuttavia, si dovrebbe non di assegnare direttamente a stdout così. Se si desidera reindirizzare stdout, si dovrebbe invece usare freopen() .

Non si dovrebbe mai manipolare direttamente gli oggetti del file - si dovrebbe trattarli come tipi opachi, e interagire solo con loro tramite le funzioni della libreria <stdio>. Jonathan elenca alcune buone ragioni.

Dalla serie C99, sezione 7.19.3, comma 6:

  

L'indirizzo dell'oggetto FILE utilizzato per controllare un flusso può essere significativo; una copia di un   oggetto file non deve servire al posto di quello originale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top