ifstream i znak konca lini C++

0

Witam,
mam problem z wczytaniem macierzy z pliku do tablicy dwuwymiarowej stworzonej za pomoca wektorow. Chcialbym aby wczytywal mi wiersz az do konca nastepnej lini. Jednak gdy robie w sposob jak ponizej to mi niewykrywa znaku '\n'

 
ifstream plik;
 	plik.open (filename);

while (!plik.eof())
{
        while (buff!='\n');
	{
                plik >> buff;
                tmp.push_back(buff);
        }
tab.push_back(tmp);
tmp.clear();
}
0

jak zadeklarowałeś buff?

0
ifstream plik(filename);
string tmp;
int i  = 0;
getline(plik, tmp);
stringstream ss(tmp);
while(ss >> i) tab.push_back(i);
0

Tylko ze ten kod

while(ss >> i) tab.push_back(i);
 

zapisze cala macierz do tablicy jednowymiarowej. A jak zrobic zeby tablica odpowiadala wierszom macierzy?
Wektor mam tak zadeklarowany:

vector < vector <int> > tab;
vector <int> tmp; 

Dzieki temu moge operowac jak na normalniej tablicy typu: tab[n][m]
A bufor mam jako

 int buff

do massther

0
santis69 napisał(a)

Tylko ze ten kod

while(ss >> i) tab.push_back(i);
 

zapisze cala macierz do tablicy jednowymiarowej. A jak zrobic zeby tablica odpowiadala wierszom macierzy?

Nie prawda. Ten kod wyżej po prostu wczytuje tylko jeden wiersz macierzy, musisz sobie go trochę przerobić.

0

Ok dziala. Napisalem cos takiego:

 
while (!plik.eof())
{
	int i = 0;
	getline(plik, tmp_s);
	stringstream ss(tmp_s);
	while (ss>>i) 
		tmp.push_back(i);
	tab.push_back(tmp);
	tmp.clear();
}

for (i=0; i<tab.size()-1; i++)
{
	for (j=0; j<tab[i].size(); j++)
	cout <<tab[i][j]<<" ";
cout<<endl;
}

Dzieki za pomoc :)

0

Mam jeszcze problem z

 operator +

Zrobilem ze do jednej macierzy dodaje druga i wynik zapisuje w tej pierwszej. A jak zrobic zeby wynik byl w nowo utworzonej macierzy? Oczywiscie chodzi mi o klasy.

 
Macierz  operator+ (const Macierz & s)
{
	int x,y;
for (x=0; x<s.tab.size(); x++)
{
	for (y=0; y<s.tab[x].size(); y++)
		tab[x][y] = tab[x][y] + s.tab[x][y];
}

	return *this;
};
0

Tworzysz w operatorze nową macierz (tymczasową), wpisujesz do niej wynik i ją zwracasz.
Pewnie będziesz musiał jeszcze napisać konstruktor kopiujący i przeładować operator=

0

I zwracaj referencję a nie obiekt.

0

Niewiem jak zrobic zeby zmienne zadeklarowane w klasie byly widziane w

operator + 

Zrobilem to na takich zmiennych globalnych:

 
typedef vector < vector<int> >tab;
vector <int> lwiersz;  //dl wiersza
int lkol=-1;   //ilosc wierszy. Musi byc -1 bo wczytuje mi jakos o 1 wiersz za duzo jakis smieci (np same 5) 
vector <int> tmp;

To zliczanie dl wiersza i ilosc wierszy dziala poprawnie i chcialem go wykorzystac do operatora +. Oczywiscie przed zliczaniem ilosci wierszy robie

 lwiersz.clear()

Zeby niedodawal do kolejnej wczytanej macierzy.
Napisalem cos takiego. Kompiluje sie jednak podczas uruchomienia wyskakuje segmentation fault. Jak zrobic zwracanie przez referencje

Macierz operator+ (const Macierz & s)
{
	vector < vector <int> > tab_new;
	int temp_new;
	int x,y;
for (x=0; x<lkol; x++)
{	
temp_new=0;
	for (y=0; y<lwiersz.size(); y++)
	{
		temp_new = tab[x][y] + s.tab[x][y];
		tmp.push_back(temp_new);
	}
tab.push_back(tmp);
tmp.clear();
}
}
 

1 użytkowników online, w tym zalogowanych: 0, gości: 1