Почему std:: fstream не записывает файл?

Я получаю различное поведение между fstream vs. oftream, которое я не могу объяснить.

Когда я использую 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, что заставляет меня думать, что файл открыт в режиме чтения-записи, правильно?

Ответы

Ответ 1

ios_base::in требуется, чтобы файл существовал.

Если вы предоставляете только 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>