LINUX.ORG.RU

[c++] из хитрого файла в массивы чисел

 


0

0

В продолжение предыдущей темы.

Есть файл вида

4 45 54 43 
456 45 545 45 
66 65 76 
 
544 546 
45

Из него требуется получить 2 массива: массив с числами первого столбца не пустых строк и массив массивов последующих за ними чисел. То есть тут выйдет так:

{4, 456, 66, 544, 45}

{
  {45, 54, 43},
  {45, 545, 45},
  {65, 76},
  {546},
  {}
}
#include <iostream> 
#include <vector> 
#include <fstream> 
#include <sstream> 
using namespace std; 
 
int main() { 
    ifstream txtInput("input.txt", fstream::in);
    int lineNum = 0; 
    while (!txtInput.eof()) { 
        istringstream fullLine; 
        string tmpTxtLine; 
        getline(txtInput, tmpTxtLine); 
        ++lineNum; 
        fullLine.str(tmpTxtLine); 
 
        while (fullLine.good()) { 
            //тут будем заполнять массив, но пока что (временно) просто показываем по одному числу
            double x; 
            fullLine >> x; 
            cout << x << " "; 
        } 
        cout << endl; 
    } 
} 

Для упомянутого выше файла вывод такой:

 
4 45 54 43  
456 45 545 45  
66 65 76  
76  
544 546  
45  
45 

В конце лишнее число. Почему? Как делать лучше?

★★★★★

Последнее исправление: Obey-Kun (всего исправлений: 1)

как-то тут адски проглючил парсер заголовка... глюк лора, не иначе.

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от lester

> 2. static ifstream txtInput; ???

не понял, как это попало в код o_O. исправил.

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от lester

а сам подход-то правильный? или лучше делать как-то иначе?

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от anonymous

> как препода по информатике зовут?

не было у нас информатики, плюсы месяц изучаю опытным путём

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от Absurd

требуется использовать стандартные средства (c, плюсы, stl)

Obey-Kun ★★★★★
() автор топика

На пустых строках x остается неинициализированным. Звезды сложились так, что в этой неиницализированной памяти остались предыдущие значения. А если, например, сделать double x = 0, то на месте пустых строк будут выводиться нули.

ftor
()

>В конце лишнее число. Почему? Как делать лучше?

Потому что пока не попытаешься прочитать, не поймешь, good или !good

while (1) {
    double x;
    fullLine >> x;
    if (!fullLine.good()) break;
    cout << x << " ";
}
linuxfan
()

можно написать менее многословно

#include <iostream>
#include <vector>
#include <fstream>
#include <sstream>
using namespace std;

int main()
{
	ifstream txtInput("input.txt", fstream::in);
	int lineNum = 0;
	string s;
	while (getline(txtInput, s))
	{
		++lineNum;
		istringstream fullLine(s);
		double x;
		while (fullLine >> x)
		{
			cout << x << " ";
		}
		cout << endl;
	}
}

anonymous
()
Ответ на: комментарий от Absurd

> Осиль уже yacc

ага, и без цепей Маркова тут тоже никак не обойтись

mannaz
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.