簡體   English   中英

在C ++中迭代所有字符的文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM