1

从事 C++ 硬件项目。我们获得了将目录中的所有 .dat 文件读取到单个 .txt 文件中的代码,然后我们需要从中提取值,没有特定的顺序。我们得到的代码是:

#if defined(_WIN32)
#define listcmd "dir \b *.dat > datfiles.txt 2>nul"
#endif

这给了我一个文本文件,其中包含比 .dat 文件名更多的信息,不过……卷信息、目录路径、文件数据等。

然后我们执行以下操作来读取文件,但我不明白这是如何工作的:

system(listcmd);
ifstream datfiles("datfiles.txt");
for_each(istream_iterator<string>(datfiles), istream_iterator<string>(), analyze);
datfiles.close();

我一直在 cplusplus.com 上查看 istream_iterator 和 for_each 页面,但可以使用一些说明。这个 for_each 语句到底在做什么?

我认为它正在执行以下操作是否正确:

  • 从 istream 一次读取一个字符串(停在空白处)
  • 将该字符串传递给分析函数(以执行任何处理......在我的情况下尝试打开文件并读取值)
  • 一旦控制返回,继续执行此操作直到到达文件末尾或流失败
4

2 回答 2

0

的功能for_each是:

将函数 fn 应用于范围 [first,last) 中的每个元素。

此模板函数的行为等价于:

template<class InputIterator, class Function>
Function for_each(InputIterator first, InputIterator last, Function fn)
{
    while (first!=last) {
       fn (*first);
       ++first;
    }
   return fn;      // or, since C++11: return move(fn);
 }
于 2014-03-24T03:09:36.590 回答
0

在经历了一个周末的挫折和疯狂追逐之后,答案很简单,我应该在下一节中使用“/b”而不是“\b”:

#if defined(_WIN32)
#define listcmd "dir \b *.dat > datfiles.txt 2>nul"
#endif

更新后,文本文件将使用非常简洁的 .dat 文件列表正确创建,每行一个。

于 2014-03-24T02:52:57.080 回答