istringstream не выводит правильные данные

У меня возникли проблемы с продолжением istringstream в цикле while, показанном ниже. Файл данных также показан ниже. Я использую getline из входного файла, чтобы получить первую строку и поместить ее в istringstream lineStream. Он проходит через цикл while один раз, затем считывает вторую строку, возвращается к началу цикла и выходит, а не продолжает цикл. Я понятия не имею, почему, если бы кто-нибудь мог помочь, я был бы благодарен. РЕДАКТИРОВАТЬ: причина, по которой у меня есть это условие цикла, заключается в том, что файл может содержать строки с ошибочными данными. Поэтому я хочу убедиться, что строка, которую я читаю, имеет правильную форму, показанную ниже в файле данных.

while(lineStream >> id >> safety){//keeps scanning in xsections until there is no more xsection IDs

    while(lineStream >> concname){//scan in name of xsection
        xname = xname + " " +concname;
    }


    getline(InputFile, inputline);//go to next xsection line
    if(InputFile.good()){
        //make inputline into istringstream
        istringstream lineStream(inputline);
        if(lineStream.fail()){
            return false;
        }
    }
}

Файл данных

4   0.2  speedway and mountain
7   0.4 mountain and lee
6   0.5 mountain and santa

person ddwong    schedule 12.12.2013    source источник
comment
Я думаю, что у вас слишком много запутанных операций чтения файлов, которые могут не согласовываться друг с другом.   -  person Abhishek Bansal    schedule 12.12.2013
comment
lineStream должен быть объявлен вверху/глобально, а не внизу, иначе он будет доступен только в блоке, который находится в   -  person user2976089    schedule 12.12.2013
comment
Что в этом смущает?   -  person ddwong    schedule 12.12.2013
comment
Как это должно работать? Почему вы сделали istringstream в конце, а не в начале? Почему fail() возвращает true, когда вы не выполняете никаких операций, кроме построения (которое должно быть выполнено успешно)?   -  person Potatoswatter    schedule 12.12.2013
comment
Это в конце, потому что я хочу убедиться, что я читаю этот определенный тип данных, а не ошибочные данные. Я отредактирую исходный пост. 'fail()' не возвращает true. Он пропускает это и переходит к проверке цикла while, а затем выходит.   -  person ddwong    schedule 12.12.2013


Ответы (1)


В представленном коде

while(lineStream >> id >> safety){//keeps scanning in xsections until there is no more xsection IDs

    while(lineStream >> concname){//scan in name of xsection
        xname = xname + " " +concname;
    }

    getline(InputFile, inputline);//go to next xsection line
    if(InputFile.good()){
        //make inputline into istringstream
        istringstream lineStream(inputline);
        if(lineStream.fail()){
            return false;
        }
    }
}

внутреннее объявление lineStream объявляет локальный объект, который перестает существовать, когда выполнение выходит из этого блока, и который не влияет на поток, используемый во внешнем цикле.


Одно из возможных исправлений — немного инвертировать код, например:

while( getline(InputFile, inputline) )
{
    istringstream lineStream(inputline);

    if(lineStream >> id >> safety)
    {
        while(lineStream >> concname)
        {
            xname = xname + " " +concname;
        }
        // Do something with the collected info for this line
    }
}
person Cheers and hth. - Alf    schedule 12.12.2013
comment
Нет, я указал в своем первоначальном комментарии: я использую getline из входного файла, чтобы получить первую строку и поместить ее в istringstream lineStream. Он проходит через цикл while один раз... Это означает, что я объявил lineStream вне всего цикла, а затем поместил его туда. Если вы не имеете в виду внутреннее объявление в if(InputFile.good()){} EDIT: я понимаю, что вы имеете в виду. Я попробую. - person ddwong; 12.12.2013
comment
Я не знаю, как объяснить это более понятно, извините. Единственное дополнительное предложение, которое у меня есть, — это попытаться выполнить ваш текущий код в голове, просто пройти его механически шаг за шагом, как это сделал бы компьютер, чтобы, возможно, вы могли убедить себя в том, что приведенное выше объяснение является осмысленным и правильным. - person Cheers and hth. - Alf; 12.12.2013
comment
Извините, я отредактировал свой оригинальный комментарий, увидев ваше редактирование. Я уже прошел это механически с отладчиком, и я пробую ваш подход. - person ddwong; 12.12.2013
comment
Я еще немного отредактировал. Первое изменение исходного while на if не влияет на выполнение, а только на ясность кода. Во-вторых, перемещение комментария о действиях с собранной информацией в более подходящее место. :-) - person Cheers and hth. - Alf; 12.12.2013
comment
Спасибо, теперь работает! Мне просто интересно, почему istringstream не сохраняет свое значение в конце и на следующей итерации? - person ddwong; 12.12.2013
comment
В последнем коде, представленном выше, потому что поток является локальной переменной в теле цикла. Он выходит за рамки, когда выполнение достигает конца тела цикла. Каждый раз. - person Cheers and hth. - Alf; 12.12.2013