Operator >> posiada przeciążenia dla input stream'a z lewej i różnych typów z prawej. Zalozmy, że plik dane.txt wyglada tak:
123 456 789
11 22 33
W tym momencie robisz tak:
ifstream in("dane.txt");
string value;
in >> value; // value = "123"
wczyta do value string "123", bo operator >> rozdziela dane po spacji. Ale możesz też od razu intepretować te liczby jako liczby a nie stringi:
ifstream in("dane.txt");
int value;
in >> value; // value = 123
Dodając pętle while(in.good()) wczytamy wszystkie liczby po kolei aż do końca pliku, ale nie wiemy kiedy przeszlismy do nowego linii (drugiego wiersza), no chyba, że znamy długość wiersza.
Potrzebujemy zatem wczytać pojedyńczą linie:
getline(in,line);
I wyciągnąc ze stringa line inty, co załatwia klasa istringstream, która działa podobnie jak ifstream, ale źródłem danych jest string, a nie plik:
istringstream stream( line );
int dlugosc_wiersza = 0;
while (stream.good()) {
stream >> value;
dlugosc_wiersza++;
}
Można w ten sposób policzyć dlugosc wiersza, ale można wykorzystać fakt, że jednocześnie czytamy liczby:
ifstream in("dane.txt");
vector <vector<int>> matrix;
string line;
int value;
while (getline(in,line)) {
istringstream stream{ line };
vector<int> row;
while (stream >> value) {
row.push_back(value);
}
matrix.push_back(row);
}
Skróciłem warunki w pętlach, bo operator >> zwraca strumień, który można rzutować do wartosci logicznej równej !stream.fail().
Wykorzystując iteratorowy konstruktor wektora mozna to skrócić jeszcze bardziej:
while (getline(in,line)) {
istringstream stream( line );
matrix.push_back(vector<int>(istream_iterator<int>(stream), istream_iterator<int>()));
}
A najbardziej można to skrócić zmieniając język na python:
matrix = []
for line in open('dane.txt'):
matrix.append([int(x) for x in line.split()])
lub w jednej linijce :D
matrix = [[int(x) for x in line.split()]for line in open('dane.txt')]