C'è una funzione in C ++ che crea un file .bin, o si tratta di codice manca qualcosa?
-
05-09-2019 - |
Domanda
Ho un codice che assomiglia a questo:
int main () {
fstream file;
file.open("test.bin", ios::out | ios::binary);
if(!file.is_open())
{
return -1;
}
int n = 3;
file.write(reinterpret_cast<char*>(&n), sizeof(n));
file.close();
return 0;
}
quando l'eseguo da sola, esce con -1, quindi ovviamente non è riuscito ad aprire "test.bin". Tuttavia, se si salva un file blocco note in bianco come "test.bin", ed eseguirlo, funziona benissimo. Quello che mi chiedo è come posso ottenere il mio programma C ++ per generare automaticamente un file vuoto "test.bin" Non se un file chiamato "test.bin" esiste già.
Soluzione
Il frammento di codice è sbagliato in quanto si sta cercando di scrivere in un file che hai aperto per l'input. Se si desidera scrivere sul file, è sufficiente utilizzare ios::out
invece di ios::in
.
Se si desidera aprire il file per la lettura, ma crearlo se non esiste, è possibile utilizzare:
file.open("test.bin", ios::in | ios::binary);
if(!file.is_open()) {
file.open("test.bin", ios::out | ios::binary);
int n = 3;
file.write(reinterpret_cast<char*>(&n), sizeof(n));
file.close();
file.open("test.bin", ios::in | ios::binary);
if(!file.is_open()) {
return -1;
}
}
In questo modo inizializzare il file con il numero intero 3 come il contenuto di default, se non esiste già.
Se esiste, lascerà il contenuto solo. In entrambi i casi, avrete il file aperto al primo byte.
Altri suggerimenti
Mi piacerebbe presumo si potrebbe probabilmente solo farlo aprendo e chiudendo un file:
if (GetFileAttributes("test.bin") == INVALID_FILE_ATTRIBUTES)
{
fstream file;
file.open("test.bin", ios::out);
file.close();
}
Una possibilità è quella di aprire in lettura / scrittura e cercare l'inizio del file.
Poi, si può leggere, scrivere o fare tutto ciò che si desidera.