Ho appena iniziato a chiedermi: in che modo è effettivamente std::fstream
aperto con std::ios::in
e std::ios::out
? Cosa dovrebbe fare? Scrivi qualcosa (per esempio) in un file vuoto, poi leggi ... cosa? Solo valore scritto? Dove dovrebbe essere il "puntatore"/"cursore" del file? Forse le risposte erano già disponibili ma non avrei potuto trovarlo.In che modo dovrebbe funzionare std :: fstream con dentro e fuori?
risposta
Che cos'è std::fstream
?
std::fstream
è una classe di flusso di file bidirezionale. Cioè, fornisce un'interfaccia per l'input e l'output per i file. È comunemente usato quando un utente ha bisogno di leggere e scrivere nella stessa sequenza esterna.
Quando un'istanza di un flusso di file bidirezionale (a differenza std::ofstream
o std::ifstream
), le openmodes ios_base::in
e ios_base::out
sono specificati di default. Ciò significa che questo:
std::fstream f("test.txt", std::ios_base::in | std::ios_base::out);
è lo stesso di
std::fstream f("test.txt");
si specificherà entrambe le opzioni se avevano bisogno di aggiungere anche alcune openmodes non predefiniti come ad esempio trunc
, ate
, app
o binary
. La modalità ios_base::trunc
è necessaria se si intende creare un nuovo file per I/O bidirezionale, poiché la modalità aperta ios_base::in
disabilita la creazione di un nuovo file.
bidirezionale I/O
bidirezionale I/O è l'utilizzo di un flusso bidirezionale per input e output. In IOStreams, i flussi standard mantengono le sequenze di caratteri in un buffer in cui funge da origine o sink per i dati. Per i flussi di output, esiste un'area "put" (il buffer che contiene i caratteri per l'output). Allo stesso modo, per i flussi di input, c'è l'area "ottieni".
Nel caso di std::fstream
(una classe per entrambi gli input e output), contiene un buffer di file congiunto che rappresenta rispettivamente l'area get e l'area put. L'indicatore di posizione che contrassegna la posizione corrente nel file è influenzato dalle operazioni di input sia sia. In quanto tale, al fine di eseguire I/O correttamente su un flusso bidirezionale, ci sono alcune regole da seguire:
- Quando si esegue una lettura dopo una scrittura o viceversa, il flusso dovrebbe essere riposizionato indietro.
- Se un'operazione di input ha colpito la fine del file, eseguire una scrittura direttamente successiva va bene.
Questo si riferisce solo a std::fstream
. Le regole di cui sopra non sono necessarie per std::stringstream
.
Spero che questi rispondano alle vostre domande. Se ne hai ancora, puoi solo chiedere nei commenti.