2016-05-30 7 views
1

ファイルに複数の行を書きたいと思います。各行には索引(実行索引)があります。 私のコードは次のとおりです。ofstream:実行中のインデックスが動作しない

ofstream outputFile; 
int index = 0; 

outputFile << ++index << ") FirstLine" <<endl 
      << ++index << ") SecondLine" <<endl 
      ... 
      << ++index << ") LastLine" <<endl; 

問題は、私は、実行中のインデックスを取得しないということです。つまり、すべての行に同じインデックス(合計行数)が設定されています。だから私の質問は、第一に、どのようにストリームワーク(なぜ、私は説明された結果を得るのかを意味する)です。第二に、私はそれを働かせるために何をすべきですか?

+0

あなたの質問に答えることなく、それぞれのコードラインの始めに 'outputFile'を入れ、各コードラインの最後に(' endl'の直後に) ';'を入れれば完了です。 –

+1

同じステートメント内の同じ変数に '++'を使うのは未定義の振る舞いです(おおまかに言えば、あまりにも大きすぎてコメントに収まりません)。これを避けるには、より多くのセミコロンを使うか、 'index + 1'、' index + 2'などを書いてください。 –

答えて

0

まず、ストリームワーク(どのように私は記述された結果を得るのですか)をどうやって行うのですか? C++標準(セクション1.9、条項15)によれば

記載した以外は、個々のオペレータのおよび個々の表現の部分式のオペランドの評価がunsequencedあります。

同じスカラーオブジェクトの別の副作用または同じスカラーオブジェクトの値を使用する値計算と比較して、スカラオブジェクトの副作用が順序付けされておらず、潜在的に並行でない場合の動作は未定義です。お使いの場合に適用

  • <<オペレータにオペランドである)++indexステートメントの評価がunsequencedです。

  • ++indexは、indexの値を変更するため、スカラオブジェクトに対して副作用があります。

  • このように、動作は定義されていません。

第二に、私はそれが仕事を得るために何をすべきでしょうか?

単一の大きな出力式を複数の行に分割すると、各++index文が別々の行になるようにすることができます。

また、ループを使用して問題とreduce repetitionの両方を解決できます。 example.ccとして

#include <array> 
#include <iostream> 
#include <string> 

int main() { 
    static const std::array<std::string, 3> lines = { 
    "First line", 
    "Second line", 
    "Last line", 
    }; 

    for (int i = 0; i < lines.size(); ++i) { 
    std::cout << i + 1 << ") " << lines[i] << std::endl; 
    } 
} 

保存これ、および使用してコンパイルします:たとえば

その後

clang++ -std=c++14 example.cc -o example 

例を実行します。これは標準出力に出力していること

$ ./example 
1) First line 
2) Second line 
3) Last line 

注意を例を簡略化するために、std::cout使用例に応じてstd::ofstreamのインスタンスに簡単に置き換えることができます。

関連する問題