Почему ofstream (& quot; log.txt & quot ;, ios :: app | ios :: trunc); всегда терпеть неудачу?

Следующий код был скомпилирован с VC ++ Nov 2012 CTP на Windows 7 x64.

#include <fstream>

using namespace std;

int main()
{
ofstream fout("log.txt", ios::app|ios::trunc);
if (!fout)
{
cout << "An error occurred!" << endl; // Always go here! Why?
}
}

Сайт cppreference.com не говорит, что ios::app нельзя сочетать с ios::trunc,

Каковы точный семантика ios::app а также ios::trunc?

8

Решение

filebuf конструктор, которому передаются эти флаги имеет поведения, основанные на этих флагах, определенных в таблице 132 в C ++ 11:

+-----------------------------------+-------------------+
|     ios_base flag combination     |  stdio equivalent |
| binary  in    out    trunc    app |                   |
+-----------------------------------+-------------------+
|               +                   |  "w"              |
|               +               +   |  "a"              |
|                               +   |  "a"              |
|               +       +           |  "w"              |
|        +                          |  "r"              |
|        +      +                   |  "r+"             |
|        +      +       +           |  "w+"             |
|        +      +               +   |  "a+"             |
|        +                      +   |  "a+"             |
+-----------------------------------+-------------------+
|   +           +                   |  "wb"             |
|   +           +               +   |  "ab"             |
|   +                           +   |  "ab"             |
|   +           +       +           |  "wb"             |
|   +    +                          |  "rb"             |
|   +    +      +                   |  "r+b"            |
|   +    +      +       +           |  "w+b"            |
|   +    +      +               +   |  "a+b"            |
|   +    +                      +   |  "a+b"            |
+-----------------------------------+-------------------+

Как видите, ваша комбинация флагов не нашел в этой таблице.

[C++11: 27.9.1.4/2]: [..] Если mode если в таблице не показана какая-то комбинация флагов, то открытие завершится неудачно.

Это семантика.

[C++11: 27.9.1.7/2] & [C++11: 27.9.1.11/2] покажите нам, что режим передается из объекта потока в объект буфера.

20

Другие решения

  • приложение (= добавление): установите индикатор положения потока в конец потока перед каждой операцией вывода
  • TRUNC (= усекать) любой текущий контент отбрасывается, предполагая длину ноль при открытии.

Как видите, не имеет смысла соединять их вместе.

6

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector