Qual è l'insieme corretto di flag di I/O per un std::fstream
, dove voglio essere in grado di leggere da e scrivere nel file, senza troncare il file se esiste, ma creandolo se non lo è?Come posso aprire un file per leggere e scrivere, crearlo se non esiste, senza troncarlo?
Ho provato
std::ios::binary | std::ios::in | std::ios::out
std::ios::binary | std::ios::in | std::ios::out | std::ios::ate
ma nessuno di questi creo il file se non esiste già.
Non voglio std::ios::app
, perché ho anche bisogno di essere in grado di cercare in giro per il file a piacimento, sia con il ottenere e messo cursori.
Una soluzione, suppongo, sarebbe quella di istanziare un std::ofstream
prima, quindi chiuderlo immediatamente e aprire lo streaming che desidero veramente, ma ciò sembra disordinato se può essere evitato con un singolo oggetto flusso.
Non è necessario il controllo o la segnalazione degli errori per il tentativo di creazione. Inoltre, penso che non sia necessario usare 'c_str()' con C++ 11 e successivi. È possibile che il file system Boost faccia questo per te (non lo so), se è così allora devi solo aspettare fino a C++ 17. ;-) –
@ Cheersandhth.-Alf as-tagged (C++ 03), sembra il motivo per il 'c_str()', anche se hai chiaramente ragione se qualcuno che sta leggendo lo farà con C++ 11 o più tardi. La costruzione 'std :: string' non era inclusa in 03x, btw? – WhozCraig
@WhozCraig: No, l'unica novità in C++ 03 era l'inizializzazione del valore. –