2013-04-29 3 views
6

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

5

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.