Newb问题:在文本文件中获取char迭代器的最佳方法是什么?
我试过了:
std::fstream csvSource (fileName);
auto aChar = csvSource.begin();
while (aChar != csvSource.end())
{
switch (*aChar)
{
case '"':
//and so on
但编译器抱怨fstream
没有begin方法。
请注意,我不能逐行执行此操作,因为引号内的换行符与其他换行符的处理方式不同(文字)。
答案 0 :(得分:4)
使用>>
类
ifstream
运算符
std::ifstream csvSource (fileName);
csvSource >> noskipws;
char c;
while (csvSource>>c)
{
switch (c)
{
case '"':
//and so on
如果你不想用迭代器做一些奇特的东西,这是最简单的方法
答案 1 :(得分:2)
如果你必须使用迭代器,你最好的选择是istreambuf_iterator,这在迭代字符时比istream_iterator
更优。
为什么你需要使用迭代器,有什么特别的原因吗?当您想要调用需要它们的算法时,它们就是为了您的利益。但这不是这种情况,因为你只是在循环。
您可以使用get()
读取字符。这可能比运营商>>更好它会进行格式化读入,并且会跳过空格(您可能不想要),除非您将skipws
标志设置为false(我认为它是noskipws
)并且可能效率稍差。
答案 2 :(得分:0)
我认为您正在寻找std:: istreambuf_iterator
#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
}
});
或者你可以简单地写csvSource >> c
来读取char-by-char。两种方法都很好。哪一个使用,取决于情况。
答案 3 :(得分:-1)
试试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));