Hogy lehet egy vektorba string-et és char-t beolvasni txt fájlból C++-ban?
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;
}
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.
"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?
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.
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
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!