[英]Iterating a file over all characters in C++
Newb問題:在文本文件中獲取char迭代器的最佳方法是什么?
我試過了:
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()
讀取一個char。 這可能比執行格式化讀入的operator >>更好,並且會跳過空白(你可能不想要),除非你將skipws
標志設置為false(我認為它是noskipws
)並且可能效率稍差。
我認為你正在尋找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。 兩種方法都很好。 哪一個使用,取決於情況。
試試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));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.