Почему разделение файлового буфера по символу пробела не работает? - PullRequest
0 голосов
/ 21 сентября 2018

Учитывая следующий код:

#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>

int main()
{
    std::stringstream istrs("1 2 3 4 5 6");
    std::vector<int> vec;
    while(!istrs.eof())
    {
        int temp;
        std::stringstream o;
        istrs.get(*o.rdbuf(), ' ');
        o >> temp;
        vec.push_back(temp);
    }
    for(auto a : vec)
        std::cout << a << " ";
    std::cout << std::endl;
}

Почему цикл никогда не завершается?Почему o остается неинициализированным?Я пытаюсь разделить буфер ifstream на более мелкие куски для обработки, но я не знаю, почему это get() не работает так, как я думал.

1 Ответ

0 голосов
/ 21 сентября 2018

Вы можете изменить свой код для анализа строки, используя getline, например:

   std::stringstream istrs("1 2 3 4 5 6");
    std::vector<int> vec;
    string temp;
    while(getline(istrs,temp, ' '))
    {
        vec.push_back(stoi(temp));
    }
    for(auto a : vec)
        std::cout << a << " ";
    std::cout << std::endl;

Я не вижу необходимости в другом потоке строки, а затем преобразовании.

Вчтобы понять, почему то, что вы упомянули, терпит неудачу, обратитесь к документации stringstream и к get .Мы имеем дело с шестой перегрузкой подписи type basic_istream& get( basic_streambuf& strbuf, char_type delim );

читает символы и вставляет их в выходную последовательность, управляемую данным basic_streambuf

Вы сохраняете это какint, попробуйте объявить temp как string, получить строку, используя оператор потока o >> temp, и выполнить преобразование в int, используя stoi.Вы найдете преобразование, которое вам удастся в первый раз, а не другие, скорее всего, программа потерпит крах.Причина в том, что после 1 вы не извлекаете никаких символов и удовлетворяете условию:

следующий доступный входной символ c равен delim, как определено в Traits :: eq (c, delim).Этот символ не извлекается.

В этом случае

Если символы не были извлечены, вызовы устанавливают (failbit).

В вашемЦикл while, если вы установите !istrs.eof() && istrs.good(), вы увидите, что программа корректно завершится, но у вас будет только одно значение.

...