Чтение одного персонажа из фстрима? - PullRequest
8 голосов
/ 07 февраля 2012

Я пытаюсь перейти от stdio к iostream, что очень сложно.У меня есть основы загрузки файла и его закрытия, но я действительно не знаю, что это за поток, и как он работает.

В stdio все относительно просто и понятно.вперед по сравнению с этим.Что мне нужно сделать, это

  1. Чтение одного символа из текстового файла.
  2. Вызов функции в зависимости от того, что это за символ.
  3. Повторпока я не прочитаю все символы в файле.

Пока у меня есть ... не так много:

int main()
{
    std::ifstream("sometextfile.txt", std::ios::in);
    // this is SUPPOSED to be the while loop for reading.  I got here and realized I have 
    //no idea how to even read a file
    while()
    {
    }
return 0;
}

Что мне нужно знать, так это как получитьодин символ и как этот символ на самом деле хранится (это строка? int? char? Могу ли я решить для себя, как его хранить?)

Как только я узнаю, что я могу справиться с остальными,Я сохраню персонажа в соответствующем контейнере, а затем использую переключатель для выполнения действий, основанных на том, чем на самом деле является этот персонаж.Это выглядело бы примерно так.

int main()
{
    std::ifstream textFile("sometextfile.txt", std::ios::in);

    while(..able to read?)
    {
        char/int/string readItem;
        //this is where the fstream would get the character and I assume stick it into readItem?
        switch(readItem)
        {
        case 1:
            //dosomething
              break;
        case ' ':
            //dosomething etc etc
              break;
        case '\n':
        }
    }
return 0;
}

Обратите внимание, что мне нужно иметь возможность проверять наличие пробелов и новых строк, надеюсь, это возможно.Также было бы удобно, если бы вместо одного универсального контейнера я мог хранить числа в int и char в char.Я могу обойти это, если нет.

Спасибо всем, кто может объяснить мне, как работают потоки и что с ними возможно.

Ответы [ 5 ]

8 голосов
/ 07 февраля 2012

Вы также можете абстрагироваться от идеи получения одного символа с streambuf_iterator s, если вы хотите использовать какие-либо алгоритмы:

#include <iterator>
#include <fstream>

int main(){
  typedef std::istreambuf_iterator<char> buf_iter;
  std::fstream file("name");
  for(buf_iter i(file), e; i != e; ++i){
    char c = *i;
  }
}
7 голосов
/ 07 февраля 2012

Вы также можете использовать стандартный for_each алгоритм:

#include <iterator>
#include <algorithm>
#include <fstream>

void handleChar(const char& c)
{
    switch (c) {
        case 'a': // do something
            break;
        case 'b': // do something else
            break;
        // etc.
    }
}

int main()
{
    std::ifstream file("file.txt");
    if (file)
        std::for_each(std::istream_iterator<char>(file),
                      std::istream_iterator<char>(),
                      handleChar);
    else {
        // couldn't open the file
    }
}

istream_iterator пропускает пробельные символы. Если они значимы в вашем файле, используйте istreambuf_iterator.

1 голос
/ 07 февраля 2012

fstream :: get

В следующий раз, когда у вас возникнет похожая проблема, перейдите на cplusplusreference или похожий сайт, найдите class , у вас есть проблемы си прочитайте описание каждого метода.Обычно это решает проблему.Поиск в Google также работает.

0 голосов
/ 25 марта 2018

На это уже ответили, но что угодно.Вы можете использовать оператор запятой , чтобы создать цикл, который ведет себя как цикл для каждого цикла, который проходит по всему файлу, читает каждый символ по одному и останавливается, когда это сделано.

char c;
while((file.get(c), file.eof()) == false){
    /*Your switch statement with c*/
}

Объяснение : Первая часть выражения в цикле for (file.get(c), file.eof()) будет работать следующим образом.Сначала выполняется file.get(c), который читает символ и сохраняет результат в c.Затем, благодаря оператору запятой, возвращаемое значение отбрасывается и выполняется file.eof (), который возвращает значение типа bool независимо от того, достигнут ли конец файла.Затем это значение сравнивается.

Side Примечание: ifstream::get() всегда читает следующий символ.Это означает, что повторный вызов будет считывать первые два символа в файле.

0 голосов
/ 07 февраля 2012
while (textFile.good()) {
  char a;
  textFile.get(a);
   switch(a)
        {
        case 1:
            //dosomething
              break;
        case ' ':
            //dosomething etc etc
              break;
        case '\n':
    }
}
...