ofstream:运行 索引不起作用

ofstream: running index doesn't work

我想将多行写入一个文件。每行都有一个索引(运行 索引)。 我的代码是:

ofstream outputFile;
int index = 0;

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

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

Firstly, how does ofstream work (meaning why do I get the described result)?

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

Except where noted, evaluations of operands of individual operators and of subexpressions of individual expressions are unsequenced.

If a side effect on a scalar object is unsequenced relative to either another side effect on the same scalar object or a value computation using the value of the same scalar object, and they are not potentially concurrent, the behavior is undefined.

适用于您的情况:

  • ++index 语句(<< 运算符的操作数)的计算未排序。

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

  • 因此,行为未定义。

Secondly, what should I do to get it work?

一个简单的选择是将单个大输出表达式拆分为多行,这样每个 ++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 的实例。