3

Newb question: what is the best way to get a char iterator over a text file?

I tried:

std::fstream csvSource (fileName);

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

but the compiler complains that fstream doesn't have a begin method.

Note, that I can't do it line-by-line, because newline characters that are within quotes are treated differently (literaly) than the other new line characters.

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を反復する場合よりも最適です。

イテレータを使用する必要がある理由はありますか?それらは、それらを必要とするアルゴリズムを呼び出したいときに役立つためにあります。しかし、ループしているだけなので、ここではそうではありません。

。を使用してcharを読み取ることができますget()。これは、フォーマットされた読み込みを行う演算子>>よりも優れている可能性があり、skipwsフラグを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 に答える