ofstream:运行索引不起作用

时间:2016-05-30 11:39:47

标签: c++ ofstream

我想在文件中写几行。每行都有一个索引(运行索引)。 我的代码是:

ofstream outputFile;
int index = 0;

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

问题是我没有运行索引。也就是说,所有行都具有相同的索引(即总行数)。所以我的问题首先是,如何工作(意味着为什么我得到描述的结果)。其次,我该怎么办才能让它发挥作用?

1 个答案:

答案 0 :(得分:0)

  

首先,如何工作(意味着为什么我会得到描述的结果)?

根据C ++标准(第1.9节,第15节):

  

除非另有说明,否则对单个操作符的操作数和单个表达式的子表达式的评估是不合理的。

     

如果标量对象的副作用相对于同一标量对象的另一个副作用或使用相同标量对象的值进行的值计算未被排序,并且它们不可能是并发的,则行为是未定义的。 / p>

适用于您的案件:

  • ++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的实例轻松替换,具体取决于您的用例。