C++ 在C++;

C++ 在C++;,c++,file,C++,File,新问题:在文本文件上获取字符迭代器的最佳方法是什么 我试过: std::fstream csvSource (fileName); auto aChar = csvSource.begin(); while (aChar != csvSource.end()) { switch (*aChar) { case '"': //and so on 但是编译器抱怨说,fstream没有begin方法 请注意,我无法逐行执行此操作,因为引号内的换行符与其他换行符的处理方式(文字)不同

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

我试过:

std::fstream csvSource (fileName);

auto aChar = csvSource.begin();
while (aChar != csvSource.end())
{
  switch (*aChar)
  {
  case '"':
  //and so on
但是编译器抱怨说,
fstream
没有begin方法


请注意,我无法逐行执行此操作,因为引号内的换行符与其他换行符的处理方式(文字)不同。

使用
类中的
操作符

std::ifstream csvSource (fileName);

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

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

我想你正在寻找
std::istreambuf\u迭代器

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

std:: istreambuf_iterator<char> begin(csvSource), end;
std::for_each(begin, end, [](char c)
             {
                  switch(c)
                  {
                        //your cases and code
                  }
             });
#include//for std::istreambuf#u迭代器
#包括//对于std::对于每个
istreambuf_迭代器开始(csvSource),结束;
std::每个_(开始,结束,[](字符c)
{
开关(c)
{
//您的案例和代码
}
});
或者您可以简单地编写
csvSource>>c
来逐字读取。这两种方法都很好。使用哪一种取决于具体情况。

试试看。使用原始循环的极低级别方法可能如下所示:

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

如果必须使用迭代器,那么在迭代字符时,最好的选择是哪个迭代器比
istream\u迭代器
更优化

但是,有什么特别的原因需要使用迭代器吗?它们的存在是为了方便您调用需要它们的算法。但这里的情况并非如此,因为您只是在循环


您可以使用
get()
读取字符。这可能比运算符>>更好,后者执行格式化读入,并将跳过空白(您可能不希望这样),除非您将
skipws
标志设置为false(我认为它是
noskipws
),并且可能效率稍低。

您不能使用
,这是格式化输入并跳过空白(OP对此感兴趣)。这样不行,它会跳过空格(请参阅OP关于处理换行符的评论)。您可以使用操纵器覆盖跳过空格,尽管这会降低简单性。代码借用了另一个问题,所以使用了字符串迭代器,仅此而已。使用get()是否更好或者
>
运算符?@Grzenio
get
获取单个未格式化字符,
运算符>>
执行格式化读取,如果其操作数类型为
char
将读取单个字符,跳过空白。因此,如果您想读取单个字符,并且不需要任何格式化,我建议建议使用
get
。除非您设置了特定标志,否则运算符>>将跳过空白,并且可能比直接的get()效率低。istream(buf)_迭代器的存在是为了在需要时将它们放入需要它们的算法中,但在您的情况下,您只是在循环,因此实际上不需要迭代器。为什么
istreambuf_迭代器
istream_迭代器
更优化(在迭代字符时)?请告诉我们您希望如何处理每个字符。用户明确要求获取迭代器,因此我假设他们知道如何取消引用。但我添加了一些示例代码,向您展示如何在循环和算法中手动处理字符。
std::copy(CharIter{csvSource}, CarIter{}, std::ostream_iterator(std::cout));