2016-09-05 4 views
15

У меня другое поведение между fstream против oftream, которое я не могу объяснить.Почему std :: fstream не записывает файл?

Когда я использую fstream, ничего не происходит, то есть ни один файл не создается:

int main() 
{ 
    std::fstream file("myfile.txt"); 
    file << "some text" << std::endl; 
    return 0; 
} 

, но когда я изменяю fstream к oftream, это работает.

Почему?

Второй аргумент fstream CTOR - ios_base::openmode mode = ios_base::in | ios_base::out, что заставляет меня думать, что файл открыт в режиме чтения-записи, верно?

+3

Это должно работать , Буферизация? Я думаю, нам нужен полный [mcve]. –

+1

У меня есть только функция с этим кодом, и она не работает. Мне больше нечего писать. MVS2015. – Narek

+0

Возможно, вы слишком рано проверяете, записал ли файл, например. «close()» вызвано только уничтожением fstream – CppChris

ответ

27

ios_base::in requires the file to exist.

Если вы предоставите толькоios_base::out, только тогда файл будет создан, если он не существует.

+--------------------+-------------------------------+-------------------------------+ 
| openmode   | Action if file already exists | Action if file does not exist | 
+--------------------+-------------------------------+-------------------------------+ 
| in     | Read from start    | Failure to open    | 
+--------------------+-------------------------------+-------------------------------+ 
| out, out|trunc  | Destroy contents    | Create new     | 
+--------------------+-------------------------------+-------------------------------+ 
| app, out|app  | Append to file    | Create new     | 
+--------------------+-------------------------------+-------------------------------+ 
| out|in    | Read from start    | Error       | 
+--------------------+-------------------------------+-------------------------------+ 
| out|in|trunc  | Destroy contents    | Create new     | 
+--------------------+-------------------------------+-------------------------------+ 
| out|in|app, in|app | Write to end     | Create new     | 
+--------------------+-------------------------------+-------------------------------+ 

PS:

Некоторые основные обработки ошибок может также оказаться полезным в понимании того, что происходит:

#include <iostream> 
#include <fstream> 

int main() 
{ 
    std::fstream file("triangle.txt"); 
    if (!file) { 
    std::cerr << "file open failed: " << std::strerror(errno) << "\n"; 
    return 1; 
    } 
    file << "Some text " << std::endl; 
} 

Выход:

C:\temp> mytest.exe 
file open failed: No such file or directory 

C:\temp> 
Смежные вопросы