2012-01-12 3 views
27

Я пытаюсь использовать std :: fstream для io для файла, и я хочу создать файл, если он еще не существует.std :: fstream не создает файл

std::fstream my_stream 
    my_stream.open("my_file_name",std::fstream::binary | std::fstream::in | std::fstream::out); 
    if(!my_stream) 
     std::cout<<"error"<<strerror(errorno); 

Я получаю этот результат: "Нет такого файла или каталога."

Как создать файл в этом случае?

ответ

38

Вы указываете std::fstream::in в своем запросе на fstream::open(). Это known, чтобы заставить его потребовать существующий файл.

Либо удалите std::fstream::in из вашего аргумента mode, либо укажите std::fstream::trunc в дополнение к другим флагам.

+20

И отмечая, что 'trunc' каждый раз создает пустой файл. –

10

Это немного грязно, но работает. Не перезаписывает файл, если он существует, но создает новый, если первый открытый сбой.

std::fstream my_stream 
my_stream.open("my_file_name",std::fstream::binary | std::fstream::in | std::fstream::out); 

if(!my_stream) 
{ 
    my_stream.open("my_file_name",std::fstream::binary | std::fstream::trunc | std::fstream::out);  
    my_stream.close(); 
    // re-open with original flags 
    my_stream.open("my_file_name",std::fstream::binary | std::fstream::in | std::fstream::out); 
} 
else 
{ 
    // read something 
} 

// read/write here 
+0

Вы можете удалить эту вторую кнопку close(). Простое открытие с флагами «binary | in | out | trunc» будет работать нормально. – TorbenC

+0

Очень поздно, но, не удалось my_stream.open ("my_file_name", std :: fstream :: binary | std :: fstream :: trunc | std :: fstream :: out); просто be my_stream.open ("my_file_name", std :: ios :: out); ? Это просто значит создать файл мгновенно ... – user2962533

Смежные вопросы