Valaki légyszíves eltudná nekem magyarázni a struct-tól lépésről lépésre? Szövegből kikeresés program (C++)
#include <iostream>
#include <fstream>
using namespace std;
struct orszag
{
string country;
string region;
int population;
int area;
float pop_density;
float coastline;
};
int st_atoi( const char * str )
{
int val = 0;
while( *str ) {
val = val*10 + (*str++ - '0');
}
return val;
}
int main()
{
struct orszag orszagok[300];
int rec_count;
ifstream olvas;
int hely, ehely;
string sor;
rec_count=0;
olvas.open("Countries.txt");
while (!olvas.eof())
{
getline(olvas,sor);
hely=sor.find("\t");
orszagok[rec_count].country=sor.substr(0,hely);
ehely=hely+1;
hely=sor.find("\t",ehely);
orszagok[rec_count].region=sor.substr(ehely,hely-ehely);
ehely=hely+1;
hely=sor.find("\t",ehely);
orszagok[rec_count].population=st_atoi(sor.substr(ehely,hely-ehely).c_str());
ehely=hely+1;
hely=sor.find("\t",ehely);
orszagok[rec_count].area=st_atoi(sor.substr(ehely,hely-ehely).c_str());
cout << orszagok[rec_count].country<< "--" << orszagok[rec_count].region<<"--";
cout << orszagok[rec_count].population<< "--" << orszagok[rec_count].area<<endl;
rec_count++;
}
olvas.close();
int db, index;
db=0;
for(index=0;index<rec_count;index++)
if(orszagok[index].region=="OCEANIA ")
db++;
cout << "Az OCEANIA regioban " << db << "orszag van " << endl;
return 0;
}
A struct-tal egy saját típust állítasz elő, aminek az elemeit a pont operátorral éred el.
st_atoi függvény: Ennek a paramétere egy tömböt vár. C++-ban paraméterátadáskor minden tömb implicit (= nem írod ki, mégis megtörténik) átalakul az első elemre mutató pointerre, ezért nem tömb típust írunk oda. Egy karaktertömb utolsó eleme általában mindig a null terminator, ami nem más mint a '\0'. Ennek értéke megegyezik a (char)0-val, egy int 0-val, és a NULL-al (C++ 11 előtt). C++-ban az a szabály, hogy a 0 false és minden ami nem false az true. Ezért van az, hogy a while( *str ) akkor "áll le", ha elértük a szöveg végét, tehát a '\0'-t.
A val = val*10 + (*str++ - '0'); kicsit trükkös. A 10-el való szorzásra azért van szükség, mert minden egyes új karakternél el kell tolni (pl: 133, jön a következő betű: "4" -> 133*10 = 1330 + 4 -> 1334).
(*str++ - '0') ez helyes zárójelezéssel: ( (*(str++)) - '0')). A tömbök elemei a memóriában folytonosan vannak tárolva, egymás után. Kezdetben ahogy írtam a paraméter az első elemre mutat. A ++ azt jelenti lesarkítva, hogy "ugorj a következőre". Ezt ismételgetve eljutunk majd a végéig (ahol a '\0' van). A * az str előtt átváltja a pointer-t a valós értékre, gyakorlatilag megadja az adatot, amire a pointer mutat. A '0' kivonásra a következő miatt van szükség: minden karakter egy szám, ha kivonsz egymásból kettőt, megkapod a távolságukat. Tehát például '9' - '0' = 9. Így konvertálod át a számokat (ugyanis az int i = '5' pl. 53 lenne, lsd. ascii tábla).
main: a programod belépési pontja.
struct orszag orszagok[300]: itt csinálsz egy tömböt, ami a memória stack területén jön létre. Fontos, hogy itt nem csak a tömb, hanem mind a 300 elem létrejön a memóriában. Mivel ez C++ kód, ide a struct kulcsszó nem kell.
ifstream olvas: ezzel megnyitsz egy "csatornát" egy fájlra, amit úgy kell elképzelni, mintha folyamatosan fogyna. Ha kiolvasod a felét, akkor a következő olvasás az előző végén fog folytatódni, így előbb-utóbb eléred a fájl végét.
olvas.open("Countries.txt"): megnyitod a csatornát.
while (!olvas.eof()): az olvas.eof() akkor true, ha elérted a fájl végét.
getline(olvas,sor): az olvas "csatornából" elkezdi átmásolgatni az adatokat a sor változóba addig, amíg el nem éri az első \n vagy \r\n (tehát sorvége karakter(eke)t). Magyarul kiolvastál egy sort a fájlból.
hely=sor.find("\t"): a find megmondja, hányadik helyen kezdődik az a szöveg, amit megadsz neki. A "\t" egy tabulátor karakter.
orszagok[rec_count].country=sor.substr(0,hely): a substr függvény fogja a szöveget (sor), és levág belőle részeket. Pontosabban amit meghagy, az az első paramétertől kezdődően annyi betű, amennyi a második paraméter. (példa: ha a sor értéke "szoveg" és hely=2, akkor a sor.substr(0,hely) nem más mint "sz").
Az algoritmust a main-ben nem részletezném, így is túl sokat írok, és van sok hiányosság / hiba a kódban.
Ami még érdekes lehet az a c_str(). Ezt egy std::string típuson használjuk, és visszaad egy C-stílusú karakterláncot, ami nem más mint a karakterekből álló tömb. Ez az, amit az elején említettem, hogy átalakul az első elemre mutató pointerre (const char*).
Remélem érthető volt amit leírtam.
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!