Чтение одного символа из fstream?

Я пытаюсь перейти от 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? В Чаре? Могу ли я сам решить, как его хранить?)

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

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. Я могу обойти это, если нет.

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

5 ответов


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

#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;
  }
}

вы также можете использовать standard :

#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 пропускает пробельные символы. Если они значимы в вашем файле, используйте .


fstream:: get

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


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

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

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

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


while (textFile.good()) {
  char a;
  textFile.get(a);
   switch(a)
        {
        case 1:
            //dosomething
              break;
        case ' ':
            //dosomething etc etc
              break;
        case '\n':
    }
}