3

新手问题:在文本文件上获取字符迭代器的最佳方法是什么?

我试过了:

std::fstream csvSource (fileName);

auto aChar = csvSource.begin();
while (aChar != csvSource.end())
{
  switch (*aChar)
  {
  case '"':
  //and so on

但编译器抱怨fstream没有开始方法。

请注意,我不能逐行执行,因为引号内的换行符的处理方式(字面上)与其他换行符不同。

4

4 回答 4

4

使用类中的>>运算符ifstream

std::ifstream csvSource (fileName);

csvSource >> noskipws;
char c;
while (csvSource>>c)
{
  switch (c)
  {
  case '"':
  //and so on

如果您不想用迭代器做花哨的事情,那是最简单的方法

于 2013-01-11T11:22:05.937 回答
2

如果你必须使用迭代器,你最好的选择是istreambuf_iterator,它比istream_iterator迭代字符时更优化。

尽管为什么您需要使用迭代器,但有什么特别的原因吗?当您想要调用需要它们的算法时,它们就在那里。但这里不是这种情况,因为你只是在循环。

您可以使用 char 读取get(). 这可能比执行格式化读入的 operator>> 更好,并且会跳过空格(您可能不想要),除非您将skipwsflag 设置为 false (我认为它是noskipws)并且可能效率稍低。

于 2013-01-11T11:25:50.793 回答
0

std::istreambuf_iterator我想你正在寻找

#include <iterator>   //for std::istreambuf_iterator
#include <algorithm> //for std::for_each

std:: istreambuf_iterator<char> begin(csvSource), end;
std::for_each(begin, end, [](char c)
             {
                  switch(c)
                  {
                        //your cases and code
                  }
             });

或者您可以简单地写入csvSource >> c以逐个字符读取。两种方法都很好。使用哪一种,视情况而定。

于 2013-01-11T11:22:29.497 回答
0

尝试std::istream_iterator。使用原始循环的非常低级的方法可能如下所示:

std::fstream csvSource (fileName);
typedef std::istream_iterator<char> CharIter;
for (CharIter it(csvSource); it != CharIter(); ++it)
{
  /* process *it */
  char c = *it;
  doSomething(c);
}

您还可以在所有标准算法和手工算法中使用这些迭代器,这比原始循环更可取。例如,要将文件中的所有字符打印到std::cout您可以使用

std::copy(CharIter{csvSource}, CarIter{}, std::ostream_iterator(std::cout));
于 2013-01-11T11:25:09.060 回答