2016-05-30 63 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節):

除非另有說明,個體經營者和單個表達式的子表達式的操作數的評價是未測序。

如果對標量對象的副作用不是相對於同一標量對象的另一副作用或使用相同標量對象的值進行值計算,而且它們不可能是併發的,則行爲是未定義的。

適用於您的情況:

  • ++index聲明(這是操作數的<<運營商)的評價是未測序。

  • ++index修改index的值,因此對標量對象有副作用。

  • 因此,該行爲是不確定的。

其次,我應該怎麼做才能得到它的工作?

一個簡單的選擇是將單個大型輸出表達式拆分爲多行,這樣每個++index語句都在一個單獨的行上。

或者,你可以通過兩種使用循環解決問題,reduce repetition

例如:

#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; 
    } 
} 

保存爲example.cc,並編譯使用:

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

然後運行的例子:

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

注意,該打印到標準輸出以簡化示例,但std::cout可根據您的使用情況std::ofstream一個實例很容易地更換。