【问题标题】:Iterate through a text file in C++ using for_each and istream_iterator to find file names使用 for_each 和 istream_iterator 遍历 C++ 中的文本文件以查找文件名
【发布时间】:2014-04-30 11:19:21
【问题描述】:

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

【问题讨论】:

    标签: c++ string algorithm istream-iterator


    【解决方案1】:

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

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

    更新后,文本文件会正确创建,其中包含一个非常简洁的 .dat 文件列表,每行一个。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-03-21
        • 2020-06-28
        • 1970-01-01
        • 2018-03-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多