Kezdőoldal » Számítástechnika » Programozás » Hogyan kell fájlból beolvasni...

Hogyan kell fájlból beolvasni adatokat structba? [C++]

Figyelt kérdés

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



#C++ #C++ fájl #c++ maximum #c++ struct #c++ file #c++ beolvasás
2020. ápr. 19. 21:35
 1/4 tabaki ***** válasza:
53%

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.

[link]

2020. ápr. 19. 23:22
Hasznos számodra ez a válasz?
 2/4 anonim ***** válasza:
100%

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.

2020. ápr. 20. 00:25
Hasznos számodra ez a válasz?
 3/4 anonim ***** válasza:
100%

#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.

2020. ápr. 20. 00:42
Hasznos számodra ez a válasz?
 4/4 anonim ***** válasza:
Annyival még kiegészítem utólag magam, hogy '\n' mellett egy || operátorral '\r'-t is nézz, hátha windows-os txt fájlt adtak, és akkor \r\n a sortörés, nem simán \n
2020. ápr. 20. 00:49
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!