Hogyan kell fájlból beolvasni adatokat structba? [C++]
A fájl szerkezete a következő:
Kis Pista 4c 2018/09/10 40 2018/09/22 30 2018/11/05 10
Név, osztály, dátum, súly
A probléma ezzel, hogy hogyan tudnám ezt egy struct tömbbe belerakni, mivel egy sorban több dátum és több súly érték is tartozik, meg a név vezeték névből és kereszt névből áll?
Kód részlet, úgy ha a fájl tartalmas
Pista, 1a, 2018/01/01 40 .....
struct Adat
{
string nev;
string osztaly;
string datum;
int suly;
};
void valogat(ifstream &x)
{
int n=0;
x >> n;
Adat a[n];
for( int i = 0; i < n; i++ )
{
x >> a[i].nev >> a[i].osztaly >> a[i].datum >> a[i].suly;
}
int max=0;
for( int i = 0; i < n; i++ )
{
if(a[i].suly > a[max].suly)
{
max=i;
}
}
és utána egy max keresés a súlyra, de ha több van egy sorban akkor azokat össze kell adni gondolom
A lényeg, hogy a sorokat darabold fel a Split metódussal egy tömbbe, és a tömbelemeket már tetszés szerint pakolhatod a struct megfelelő mezőibe.
Semmiképpen nem ezt ajánlanám, amit az előző, C++ a nyelv!
Én azt mondanám, hogy alapból úgy olvasd be, többféle függvény is létezik rá. Például a C nyelvből "örökölt" fscanf is tökéletes, ha jobb nem jut az eszedbe, és azzal nagyon jól tudod megfelelően tárolni.
#2 vagyok még: a kódod az előbb nem néztem, most pótlom:
Na tehát van egy stream beolvasásod.
A nevet a következőképp tudod beolvasni: beolvasod az első tagot, aztán a szóközt, aztán a második tagot.
Ehhez létrehoznék egy-egy ideiglenes változót, így valahogy:
string vez_nev, ker_nev;
x >> vez_nev >> " " >> ker_nev //aztán tovább a sor többi része, és a sor után
a[i].nev = vez_nev + " " + ker_nev;
A dátum-súly többszörözésre pedig a következőt találtam ki: a súly után mindenképpen áll egy karakter a fájlban, ami számunkra lényegtelen lesz, viszont itt hasznos (vagy szóköz lesz ott, és akkor van még adat, vagy egy '\n' új sor karakter van ott). Ezt a karaktert beolvasod, és ez alapján döntesz. Én betenném az egészet egy while ciklusba.
Így: (nem szokásom kódot adni, de te próbálkoztál, és tényleg érdekes ötlet kell a fájl formátuma miatt)
for( int i = 0; i < n; i++ )
{
string vez_nev, ker_nev;
char elvalaszto;
x >> vez_nev >> " " >> ker_nev >> a[i].datum >> a[i].suly;
x >> elvalaszto;
while(elvalaszto!='\n'){
x >> a[i].datum...
}
}
//Itt jön a probléma a ..-nál: az adat tömbben nem léphetünk gondolom előre, és a dátum-súly az fix méretű. Feltételezem, azokból egy std::list-et kéne csinálni, és ahhoz hozzáadni, mivel ez struktúrájában érettségi feladatnak tűnik. Ott pedig elvárás a listák használata minden nyelv esetén.
Ha ezután sem boldogulsz, írj rám privátban.
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!