在c++中遍历文件中的所有字符



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

我试着:

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

但是编译器抱怨fstream没有begin方法

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

使用ifstream类中的>>操作符

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

如果你不想用你的迭代器做一些花哨的东西,这是最简单的方法

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

使用迭代器有什么特别的原因吗?当你想调用一个需要它们的算法时,它们是有好处的。但是这里不是这样,因为你只是在循环。

你可以直接用get()读入一个字符。这可能比操作符>>要好,>>执行格式化的读入操作,并且将跳过空白(您可能不想要),除非您将skipws标志设置为false(我认为是noskipws),并且可能效率略低。

尝试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));

我想你在寻找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来逐字符读取。两种方法都很好。使用哪一个,取决于情况。

相关内容

  • 没有找到相关文章

最新更新