La modifica del valore di stdout in un programma C ++
-
22-08-2019 - |
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
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.