2016-05-30 71 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一个实例很容易地更换。