使用for_each和istream_iterator迭代C ++中的文本文件以查找文件名

时间:2014-03-23 03:33:02

标签: c++ string algorithm istream-iterator

使用C ++ HW项目。我们获得了将目录中的所有.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一次读取一个字符串(在空白处停止)
  • 将该字符串传递给analyze函数(执行任何处理...尝试在我的情况下打开文件并读取值)
  • 一旦控制返回,继续执行此操作直到文件结束或流失败

2 个答案:

答案 0 :(得分:0)

在经历了一个沮丧的周末并且进行了一场疯狂的追逐之后,答案很简单,我应该使用&#34; / b&#34;而不是&#34; \ b&#34;在以下部分中:

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

更新后,文本文件会正确创建,并带有非常整齐的.dat文件列表,每行一个。

答案 1 :(得分: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);
 }