istringstream не проходит всю строку

Рейтинг: 2Ответов: 1Опубликовано: 09.09.2014

Суть алгоритма: std::istringstream (как я понимаю) сам автоматически отсекает пробелы, оставляя число. Это число заносится в массив. Суть в том, что istringstream считывает число 30, и дальше считывание не идет, просто увеличивается индекс.

Код:

int *timeLine = new int();

std::string sLine = "";
std::string tLine = "";
std::string lastZero = "";
int indexNumber = 0;
std::ifstream infile(argv[1]);

while (sLine != "0 0 0")
    {
        int temp = 1;
        getline(infile, sLine);

        std::istringstream stream (sLine);

        lastZero = sLine[sLine.length() - 2];
        lastZero += sLine[sLine.length() - 1];

        std::istringstream tStream (tLine);

        if ((sLine != "0 0 0") && lastZero == " 0") {

            tLine = tLine + " " + sLine;
            std::cout << tLine << "\n";

            while (temp != 0) {

                tStream >> temp;

                if (temp != 0) {
                    timeLine[indexNumber] = temp;
                    indexNumber++;
                }
            }

        } else {

            tLine = tLine + " " + sLine;
            std::cout << tLine << "\n";
        }

    }

Вид текста в файле:

 19  20
30
  25 35 0
0 0 0

Результат сложения строки во время чтения файла:
19 20 30 25 35 0

0 - конец строки. Потом сам алгоритм добавления каждого числа в массив.

Обновление

timeLine - динамический массив. Есть строка, которая заканчивается нулем. Но бывают варианты, когда строка (в файле) разбита на подстроки, как показано "Вид текста в файле". С этой белеберды я создаю одну цельную строчку (вместе с нулем), показано на "Результат сложения". Теперь прохожусь стрингстримом и считываю числа в массив. Но стрингстрим почему-то останавливается на числе 30 и дальше числа не считывает, и они, естественно, не попадают в массив. Приложение тупо висит, типа что-то там себе считывает.

Вот и не могу понять, почему так происходит. Стрингстрим сам удаляет пробелы. Пробелов между числами может быть несколько. Но на работу не влияет.

Ответы

▲ 2Принят

@iSerg:
Мой Вам совет.

Рекомендация №1
Перепишите код! Разбейте задачу, решаемую вашей процедурой, на несколько более мелких подзадач и для каждой подзадачи напишите по процедуре. А в последствии при более-менее понятном коде Вам будет проще сделать оптимизацию, если о ней Вам намекнет Ваш профайлер.

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

Рекомендация №2
Пишите формируемый результат в std::stringstream, а при возврате результата вызовете его rdbuf() для записи в любой из потомков std::ostream.