Kezdőoldal » Számítástechnika » Programozás » Hogy lehet egy vektorba...

Amanda88 kérdése:

Hogy lehet egy vektorba string-et és char-t beolvasni txt fájlból C++-ban?

Figyelt kérdés

Integer beolvasása sikerül, de ehhez a konstruktorban push_back()-et használva előre feltöltöttem a mátrixot nullákkal. Amikor string-et, char-t próbáltam beolvasni fájlból, ezt a részt kikommenteztem és átírtam a beolvasást. Így azt írta ki egyből, miután megjelent egy üres konzol-ablak, hogy a program működése leállt. Ha otthagyom a nullákkal feltöltő push_back()-et, akkor char-ral hibásan, de működik: 12-ből csak 6 karaktert olvas be. String-et beolvasva semmit nem, egyből kiírtja még push_back()-el is, hogy a program működése leállt.



Int-et sikeresen olvas be:


#include <vector>

#include <iostream>

#include <fstream>

#include <string>

using namespace std;


template <typename Template> class Matrix

{

vector<Template> adat;

int sor;

int oszlop;


public:

Matrix(int s=1, int o=1): sor(s), oszlop(o)

{

for (int i=0; i<(sor*oszlop); i++)

{

adat.push_back(0);

}

}


friend istream& operator>> (istream& is, Matrix<Template> &m)

{

FILE *file;

file= fopen("Matrix.txt","r");


for (int i=0; i<(m.sor*m.oszlop); i++)

{

fscanf(file,"%i",&(m.adat[i]));

}


fclose(file);


return is;

}


friend ostream& operator<< (ostream& os, const Matrix<Template> &m)

{

for (int i=0; i<(m.sor*m.oszlop); i++)

{

cout<<m.adat[i]<<" ";


if( (i+1) != 0 && m.oszlop != 1)

{

if ((i+1)%(m.oszlop) == 0) // sortores, ha tobb, mint 1 oszlop van es a sor vegere ert a kiiras

cout<<endl;

}


else if (m.oszlop == 1)

cout<<endl;

}

return os;

}


~Matrix(){};

};


int main()

{

Matrix<int> matrix3(3,4); // 3 sor, 4 oszlop


cin>>matrix3;

cout<<endl<<endl;


cout<<matrix3<<endl;

cout<<endl;


return 0;

}



Char már nem megy:


#include <vector>

#include <iostream>

#include <fstream>

#include <string>

using namespace std;


template <typename Template> class Matrix

{

vector<Template> adat;

int sor;

int oszlop;


public:

Matrix(int s=1, int o=1): sor(s), oszlop(o)

{

for (int i=0; i<(sor*oszlop); i++)

{

adat.push_back(0);

}

}


friend istream& operator>> (istream& is, Matrix<Template> &m)

{

FILE *file;

file= fopen("Matrix.txt","r");


for (int i=0; i<(m.sor*m.oszlop); i++)

{

fscanf(file,"%c",&(m.adat[i]));

}


fclose(file);


return is;

}


friend ostream& operator<< (ostream& os, const Matrix<Template> &m)

{

for (int i=0; i<(m.sor*m.oszlop); i++)

{

cout<<m.adat[i]<<" ";


if( (i+1) != 0 && m.oszlop != 1)

{

if ((i+1)%(m.oszlop) == 0) // sortores, ha tobb, mint 1 oszlop van es a sor vegere ert a kiiras

cout<<endl;

}


else if (m.oszlop == 1)

cout<<endl;

}

return os;

}


~Matrix(){};

};


int main()

{

Matrix<char> matrix3(3,4); // 3 sor, 4 oszlop


cin>>matrix3;

cout<<endl<<endl;


cout<<matrix3<<endl;

cout<<endl;


return 0;

}



2014. dec. 11. 18:39
 1/3 zsomkovacs ***** válasza:

Kezdésnek pár hasznos tipp:

- a vectornak van resize metódusa, nem kell egyesével beletenni a 0-kat inicializálásnál

- ha már << és >> operátorokat írsz, miért fscanf-et használsz? A file >> m.adat[i] is működne.

- az istream>> operátor NE nyisson meg fájlt és töltsön be onnét adatot, mi értelme van ennek? Van egy stream, onnét kéne beolvasni a mátrixot. Ha az a képernyő, akkor a képernyőről fogja, ha a fájl, akkor a fájlból.

-az ostream>> szintén ne a cout-ra írjon, hanem a stream-re.

2014. dec. 11. 19:24
Hasznos számodra ez a válasz?
 2/3 A kérdező kommentje:

"Van egy stream, onnét kéne beolvasni a mátrixot. Ha az a képernyő, akkor a képernyőről fogja, ha a fájl, akkor a fájlból."


Az a baj, hogy ezt nem teljesen értem...ennyire nem megy a fájlból való beolvasás/kiírás. Ezt hogy érted? A <<operátortól külön, egy függvénybe tegyem a fájlból való beolvasást?

2014. dec. 11. 19:29
 3/3 zsomkovacs ***** válasza:

Nem, pont erre való a >> operátor. Ha megnézed az operátorod deklarációját


friend istream& operator>>(istream& is, Matrix<Template>& m)


láthatod, hogy két paramétere is van. A második a mátrix, amibe olvasol, ez egyértelmű. Az első pedig egy istream&, ami egy bemeneti stream.


Egy ilyen stream elég sok minden lehet, például a cin is egy istream, de egy olvasásra megnyitott fájl is lehet az (ifstream típusként az istream-ből van származtatva, a FILE* NEM az). Amikor leírod, hogy


cin>>a;


akkor a cin (istream) >> operátorát hívod, az első paramétere a cin& lesz, a második pedig az a&. Ugyanígy itt is olvashatsz az is-ről:


is >> m.adat[i];


Az, hogy honnan olvasol, attól függ, hogy hívod meg a beolvasást. Ha azt írod, hogy


cin >> mat;


akkor a cin-ről, míg


ifstream f("Matrix.txt");

f >> mat;

f.close();


esetén a Matrix.txt fájlból. Az operátor végén pedig vissza kell adnunk a megmaradt is-t, hiszen arról még olvashatunk tovább.

2014. dec. 11. 19:55
Hasznos számodra ez a válasz?

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!