9

次のコードは、Windows 7 x64 で VC++ Nov 2012 CTP を使用してコンパイルされました。

#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 の Web サイトios::appには、 と組み合わせて使用​​できないとは記載されていませんios::trunc

と の正確セマンティクスは何ですか?ios::appios::trunc

4

2 に答える 2

22

これらのfilebufフラグが渡されるコンストラクタは、C++11 の表 132 で定義されているフラグに基づいて動作します。

+-----------------------------------+-------------------+
|     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]は、モードがストリーム オブジェクトからバッファ オブジェクトに渡されることを示しています。

于 2013-02-26T08:49:03.543 に答える
6
  • app (=append): 各出力操作の前に、ストリームの位置インジケータをストリームの末尾に設定します
  • trunc (=truncate) 開いた時点で長さがゼロであると仮定して、現在のコンテンツはすべて破棄されます。

ご覧のとおり、両方を一緒にすることは意味がありません。

于 2013-02-26T08:03:46.943 に答える