Video: GitHub Actions - Now with built-in CI/CD! Live from GitHub HQ 2024
Quando apri un file costruendo un'istanza ofstream o ifstream, puoi modificare il modo in cui il file si aprirà fornendo quelli che sono chiamati flag. In termini informatici, un flag è semplicemente un piccolo oggetto la cui presenza o assenza di presenza indica a una funzione come fare qualcosa. Con le classi ofstream e ifstream, la funzione in questione è il costruttore.
Un flag assomiglia a ios:: app se stai usando un compilatore che non è completamente ANSI-compatibile, o assomiglia a ios_base:: app se ne stai usando uno completamente conforme ANSI. Questo particolare flag indica che si desidera scrivere su un file, ma si desidera aggiungere a qualsiasi dato esistente che potrebbe già essere contenuto in un file. Si fornisce questo flag come argomento del costruttore per ofstream, come in uno dei seguenti esempi:
di outfilestream ("AppendableFile. Txt", ios:: app); ofstream outfile ("AppendableFile. txt", ios_base:: app);
Si può vedere che il flag viene aggiunto come secondo parametro al costruttore. Esistono altre flag oltre all'app e puoi combinarle utilizzando l'operatore o, |. Ad esempio, un flag è ios:: nocreate (che non è incluso nei nuovi compilatori).
Questo significa "apri il file solo se già esiste. "Cioè, non creare il file se non esiste. (Ricordare che ofstream crea un file se non esiste già.) Se il file non esiste, l'apertura non riuscirà e quando si chiama fail, si otterrà un vero.
Lo ios:: nocreate flag è a portata di mano con ios:: app. Insieme, questi significano aprire un file esistente e aggiungervi . Cioè, i due insieme funzioneranno solo se il file esiste già e la chiamata aprirà il file per un'operazione di aggiunta. Se il file non esiste già, il file non verrà creato. Ecco una chiamata di esempio:
ofstream outfile ("… / MyFile. Txt", ios:: app | ios:: nocreate); if (outfile. fail ()) {cout << "non può aprire il file!" << endl; return 0;} outfile << "hi" << endl; outfile. vicino();
Se MyFile. txt non esiste quando si esegue questo codice, si ottiene il messaggio Impossibile aprire il file! Ma se MyFile. txt esiste, l'applicazione lo apre, aggiunge la stringa Hi ad esso e infine lo chiude.
Si scopre che il flag nocreate non è disponibile nella nuova libreria standard. Bummer. Pertanto, il codice funziona solo se si sta utilizzando una versione precedente della libreria. Quando si utilizza il codice: Compilatore blocchi, viene visualizzato il seguente messaggio di errore:
errore: 'nocreate' non è un membro di '; std:: ios '
Tuttavia, ti consigliamo di verificare se il tuo particolare compilatore include una libreria che supporta ios:: nocreate.Il tuo compilatore può supportarlo comunque, anche se include la nuova libreria standard. In alternativa a iOS:: nocreate, è possibile utilizzare il seguente codice (trovato nell'esempio FileOutput02):
ifstream infile ("… / MyFile. Txt"); if (infile. fail ()) {cout << "non può aprire il file!" << endl; return 0;} infile. vicino(); ofstream outfile ("… / MyFile. txt", ios:: app); file << "ciao" << endl; outfile. vicino();
In questo caso, si inizia tentando di aprire il file per la lettura. Se il file non esiste, non è possibile leggere da esso e il codice viene chiuso con un messaggio di errore. Se il codice può leggere dal file, riapre il file per la scrittura. Questa è una soluzione ingombrante, ma funziona.
Di seguito è riportato un elenco dei flag disponibili. Innanzitutto, ecco quelli per iOS, nel caso in cui si utilizzi un compilatore che non è completamente conforme ANSI:
-
ios:: app: questo flag indica che si desidera aprire un file e aggiungerlo ad esso.
-
ios:: in: Includi questo flag se vuoi leggere da un file.
-
ios:: out : Includi questo flag se vuoi scrivere su un file.
-
ios:: trunc : Includi questo flag se vuoi cancellare il contenuto del file prima di scriverci sopra. È l'opposto di append, ed è anche l'impostazione predefinita se non includi specificamente ios:: app.
-
ios:: nocreate : Usa questo flag se vuoi assicurarti che il file non venga creato se non esiste, con il risultato che il file non viene aperto.
-
ios:: noreplace : Questa bandiera è l'opposto di nocreate. Usa questo flag se vuoi solo creare un nuovo file. Se si utilizza questo flag e il file esiste già, il file non verrà aperto e tale errore restituirà true .
I compilatori ANSI-compatibili non supportano neanche ios:: flag noreplace. In questo caso, puoi usare l'opposto della correzione per il flag ios: nocreate, come mostrato qui (e trovato nell'esempio FileOutput03):
ifstream infile ("… / MyFile. Txt"); if (! infile. fail ()) {cout << "il file esiste già!" << endl; return 0;} infile. vicino(); ofstream outfile ("… / MyFile. txt"); file << "ciao" << endl; outfile. vicino();
In questo caso, il codice tenta di aprire il file per la lettura. Se il file esiste, il codice mostra un messaggio di errore ed esce. In caso contrario, il codice crea un nuovo file e lo scrive.
I seguenti flag sono disponibili in un compilatore assolutamente conforme ANSI!
-
ios:: mangiato: usa questo flag per andare alla fine del file dopo averlo aperto. Normalmente, si utilizza questo flag quando si desidera aggiungere dati al file.
-
ios_base:: binary: utilizzare questo flag per specificare che il file che si sta per aprire conserverà dati binari, ovvero dati che non rappresentano stringhe di caratteri.
-
ios_base:: in: specificare questo flag quando si desidera leggere da un file.
-
ios_base:: out: includi questo flag quando vuoi scrivere su un file.
-
ios_base:: trunc: includi questo flag se vuoi cancellare il contenuto di un file prima di scriverlo.
-
ios_base:: app: includi questo flag se vuoi aggiungerlo al file. È l'opposto di trunc - cioè, le informazioni che sono già nel file quando lo apri rimarranno lì.
Perché hai bisogno di una bandiera e una bandiera? Sembra che il computer dovrebbe sapere se stai scrivendo su un file o leggendo da esso, a seconda (rispettivamente) se usi ofstream o ifstream. La risposta al motivo per cui si dispone di una bandiera in entrata e una bandiera di uscita è che sono disponibili altre classi oltre astream e ifstream.
I compilatori che non supportano ancora completamente lo standard ANSI hanno una classe generica nelle loro librerie chiamate fstream. I compilatori ANSI-compatibili hanno nelle loro librerie una classe template chiamata basic_filebuf e una classe chiamata filebuf. Se si utilizzano queste classi, è possibile utilizzare i flag di entrata e uscita.