Struktúra C++

Címkék
Struktúra C++
2018-08-30T21:25:37+02:00
2018-09-02T17:08:29+02:00
2022-12-05T13:45:38+01:00
bagameri
Sziasztok!
Légyszíves segítsetek!!! 

Egy struktúrát tartalmazó program megírásába fogtam C++-ban (ez az első strut-os progim), de valami miatt nem működik. Code:Blocks-ban írtam. A "szemely.txt" állomány 20-szor 3-3 sort tartalmaz. pl:
Nagy János
Miskolc
34
Németh Kata
Eger
23
...

F9-cel futtatva behozza a DOS-os ablakot, amely teljesen üres. Semmi sem történik :(
A Kód:

#include <iostream> #include <fstream> #include <cstdlib> using namespace std; struct szemely { string nev; string varos; int kor; }; szemely AdatTomb[10]; int index = 0; void kiiras(int); int main() { ifstream befajl; befajl.open("emberek.txt"); while(!befajl.eof()) { befajl >> AdatTomb[index].nev; befajl >> AdatTomb[index].varos; befajl >> AdatTomb[index].kor; index ++; } befajl.close(); for(int i = 0; i < index-1 ; i++) { kiiras(i); cout << endl << endl; } system("pause"); return 0; } void kiiras(int ind) { cout << AdatTomb[ind].nev << endl; cout << AdatTomb[ind].varos << endl; cout << AdatTomb[ind].kor << endl; }
Köszi előre is!
Mutasd a teljes hozzászólást!
atoi, stoi egésszel tér vissza. Neked a 'KorTomb' változód egy 10 elemű int tömb.
Egy 10 elemű int tömbnek nem tudsz egyetlen int-et értékül adni.
Lemaradt az indexelés gondolom.

De lépj hátra egyet. A kor miért string? Legyen olyan típusú, amilyen reprezentációban/modell szerint szükséged van rá. Maradj az int-nél.. szerintem.
Mutasd a teljes hozzászólást!

  • Lássuk csak:

    A "szemely.txt" állomány 20-szor 3-3 sort tartalmaz.

    vs:

    szemely AdatTomb[10];
    Szerintem ez nem jó.

    Másodszor:

    befajl >> AdatTomb[index].nev; befajl >> AdatTomb[index].varos; befajl >> AdatTomb[index].kor;
    Ekkor a nev-ben a Nagy lesz, a városban pedig a János...

    Első körben ezeket javítsd, utána látni fogod, hol a hiba.
    Mutasd a teljes hozzászólást!
  • Köszönöm.
    A 20 elírás volt, természetesen 10x3 sor van az állományban.
    A teljes sor beolvasásához gondolom a getline kellene, de sajnos nem tudom, hogy kellene összehozni 
    Mutasd a teljes hozzászólást!
  • A teljes sor beolvasásához gondolom a getline kellene, de sajnos nem tudom, hogy kellene összehozni

    std::getline(befajl, AdatTomb[index].nev);
    A kódodban több olyan rész is van amin lehetne szépíteni, illetve olyan is ami megfelelő(üres) txt fájl mellett hibás kimenetet fog eredményezni.
    Mutasd a teljes hozzászólást!
  • A getline...
    Mutasd a teljes hozzászólást!
  • Köszönöm.

    Erre a sorra:
    getline(befajl, AdatTomb[index].kor);

    error: no matching function for call to 'getline(std:: ...)

    üzenetet kaptam.
    Mutasd a teljes hozzászólást!
  • Ha a kor-t string-ként definiálom, akkor kiírja a txt tartalmát.  Ez miért van?

    struct szemely { string nev; string varos; string kor; };
    Mutasd a teljes hozzászólást!
  • std::getline - cppreference.comMert nem létezik olyan getline függvény, melynek a 2. paramétere egy int..
    Miből gondoltad, hogy az úgy használható?
    Mutasd a teljes hozzászólást!
  • A kódod elejére szúrd be a többi alá az:

    include <string>;
    sort és működni fog.
    .
    Mutasd a teljes hozzászólást!
  • Köszi. Tényleg igazad van a getline-nal.
    Én viszont csak azt néztem, hogy milyen adataim vannak a txt fájlban.
    Mutasd a teljes hozzászólást!
  • Most meg az a probléma, hogy ha a "kor" szöveg típusú, akkor nem tudom pl. az átlagát kiszámítani.
    Át lehet konvertálni a stringként tárolt adatot int-re?
    Így próbáltam, de nem működik:

    int KorTomb[10]; for(int i=0 ; i<=index ; i++) { KorTomb
    =atoi(AdatTomb
    .kor);
    }


    Mutasd a teljes hozzászólást!
  • A .kor); természetesen nem válik el az előző sortól, de nem tudtam egy sorba írni, a prog.hu mindig szétszedi
    Mutasd a teljes hozzászólást!
  • Most így néz ki a program:

    #include <iostream> #include <fstream> #include <cstdlib> #include <string> #include <sstream> using namespace std; struct szemely { string nev; string varos; string kor; }; szemely AdatTomb[10]; int index = 0; void kiiras(int); int main() { setlocale(LC_ALL,""); ifstream befajl; befajl.open("emberek.txt"); while(!befajl.eof()) { getline(befajl, AdatTomb[index].nev); getline(befajl,AdatTomb[index].varos); getline(befajl,AdatTomb[index].kor); index ++; } befajl.close(); int KorTomb[10]; for(int i=0 ; i<=index ; i++) { KorTomb=atoi(AdatTomb.kor); } int osszeg=0; for(int i=0 ; i<=index ; i++) { osszeg=osszeg+KorTomb
    ;
    } cout << osszeg; for(int i = 0; i < index ; i++) { kiiras(i); cout << endl << endl; } system("pause"); return 0; } void kiiras(int ind) { cout << AdatTomb[ind].nev << endl; cout << AdatTomb[ind].varos << endl; cout << AdatTomb[ind].kor << endl; }
    Ez a hibaüzenet:

    error: request for member 'kor' in 'AdatTomb', which is of non-class type 'szemely [10]'|


    Mutasd a teljes hozzászólást!
  • Az adatot úgy tárold, ahogy értelme van. A 'kor'-t nem string ként érdemes reprezentálni, hanem számként.

    Miért nem maradsz az eredeti getline-os megoldásnál és amikor a kor-t olvasod be, akkor az adott sort int-é konvertálod. Erre természetesen biztosít függvényt az 'std' könyvtár:
    std::stoi
    Mutasd a teljes hozzászólást!
  • Az előző bejegyzésemből:
    int KorTomb[10]; for(int i=0 ; i<=index ; i++) { KorTomb=atoi(AdatTomb.kor); }
    Mint láthatod az előző bejegyzésemben, így próbáltam konvertálni. Erre kaptam az előző bejegyzésben idézett hibaüzenetet,
    Próbáltam stoi-val is, de azzal sem sikerült.
    Mutasd a teljes hozzászólást!
  • atoi, stoi egésszel tér vissza. Neked a 'KorTomb' változód egy 10 elemű int tömb.
    Egy 10 elemű int tömbnek nem tudsz egyetlen int-et értékül adni.
    Lemaradt az indexelés gondolom.

    De lépj hátra egyet. A kor miért string? Legyen olyan típusú, amilyen reprezentációban/modell szerint szükséged van rá. Maradj az int-nél.. szerintem.
    Mutasd a teljes hozzászólást!
  • #include <iostream> #include <fstream> #include <cstdlib> #include <string> #include <sstream> using namespace std; struct szemely { string nev; string varos; int kor; }; szemely AdatTomb[10]; int index = 0; void kiiras(int); int main() { setlocale(LC_ALL,""); ifstream befajl; befajl.open("emberek.txt"); while(!befajl.eof()) { getline(befajl, AdatTomb[index].nev); getline(befajl,AdatTomb[index].varos); //getline(befajl,AdatTomb[index].kor); befajl >> AdatTomb[index].kor; index ++; } befajl.close(); int KorTomb[10]; for(int i=0 ; i<=index ; i++) { KorTomb[i]=AdatTomb[i].kor; } int osszeg=0; for(int i=0 ; i<=index ; i++) { osszeg=osszeg+KorTomb[i]; } cout << osszeg; for(int i = 0; i < index ; i++) { kiiras(i); cout << endl << endl; } system("pause"); return 0; } void kiiras(int ind) { cout << AdatTomb[ind].nev << endl; cout << AdatTomb[ind].varos << endl; cout << AdatTomb[ind].kor << endl; }
    Sajnos így sem fut a progi. Hibaüzenet nincs, de a DOS-os képernyő üres.
    Mutasd a teljes hozzászólást!
  • std::getline
    Notes rész leírja, hogy miért nem nyerő keverni a 'getline' és az 'operator>>' használatát.
    A megoldást is leírja.

    Ha probléma van a programoddal debuggold, azt is meg kell tanulni és nagyon fontos része a fejlesztésnek.
    Hogy próbálkoztál vele?
    Első legegyszerűbb lépésként, a debugger használata nélkül bele rakhatnál pár kiiratást közvetlen a beolvasáshoz.
    Utána kipróbálhatod, hogy a kód szerkesztése nélkül is tudod debuggolni break-point-ok segítségével, valamint sorról sorra léptetve az alkalmazást a debuggerből, vizsgálva a változók értékeit.

    Mire való a KorTomb? miért nem közvetlen az AdatTomb-ből szummázol?

    C-t tanultál C++ előtt? Amennyiben igen, akkor lehet gyakorolni az STL használatát, pl (std::vector, std::accumulate).
    Bár ez még ráér, egyszerre csak egy probléma :)
    Mutasd a teljes hozzászólást!
  • Rakj néhány breakpointot a beolvasáshoz, majd figyeld meg, mik vannak a struktúrádban. Utána meglátod, hogy hol a hiba.
    Mutasd a teljes hozzászólást!
  • Közben én is rájöttem, hogy felesleges a KorTomb. Ki is javítottam AdatTomb-re.
    A Code::Blocks-nak a debugolásával is próbálkoztam, de már nagyon elveszítettem a kedvemet :(
    Mutasd a teljes hozzászólást!
  • A programozás nem egyszerű dolog, bármely nyelven is próbálod. Kitartás és rengeteg rá szánt óra kelleni fog hozzá. (mint a legtöbb dologhoz..)
    Mutasd a teljes hozzászólást!
  • Köszönöm a kedvességedet. Teljesen igazad van, sokat kell foglalkozni vele, de szerintem akinek van hozzá érzéke, az nem bénázik ennyit, mint én. (Levonhatom a tanulságot, sajnos )
    Most nagyon fáradt vagyok, mert egész éjjel is ezen járt az agyam, nem tudtam jól aludni. Talán ha pihentebb leszek, akkor rájövök a megoldásra.
    Még egyszer köszi szépen a biztatást.
    Mutasd a teljes hozzászólást!
  • Kis lépésekben próbálkozz, úgy több sikerélményed volt.
    Személy szerint a C-ből C++ felé mozdulást javasolnám, de ez csak az én személyes véleményem/preferenciám.
    Mutasd a teljes hozzászólást!
  • #include <iostream> #include <fstream> #include <vector> #include <string> using namespace std; struct szemely { string nev; string varos; int kor; }; int main() { vector<szemely> result; filebuf fb; if (fb.open("emberek.txt", ios_base::in)) { istream is(&fb); while (!is.eof()) { string nev; string varos; string skor; getline(is, nev); getline(is, varos); getline(is, skor); if (int kor = atoi(skor.c_str())) { result.push_back(szemely()); result.at(result.size() - 1).nev = nev; result.at(result.size() - 1).varos = varos; result.at(result.size() - 1).kor = kor; } else { cout << "Bad format.\n"; } } } else { cout << "Failed to open file.\n"; } for (int i = 0; i < result.size(); ++i) { cout << result.at(i).nev << "\n"; cout << result.at(i).varos << "\n"; cout << result.at(i).kor << "\n"; cout << "\n"; } return 0; }
    Mutasd a teljes hozzászólást!
  • Sikerült a kérdezőnél is rosszabb kódot írnod
    Mutasd a teljes hozzászólást!
  • Köszönöm a biztatást. Nem adtam fel.
    Megoldottam. A lényeg itt van, az egészet most nem másolom ide:

    while(!befajl.eof()) { getline(befajl, AdatTomb[index].nev); getline(befajl, AdatTomb[index].varos); string sor; getline(befajl, sor); AdatTomb[index].kor=atoi(sor.c_str()); index ++; }
    Mutasd a teljes hozzászólást!
  • Ha van időd még foglalkozni vele, akkor szerintem még foglalkozz ezzel a feladattal kicsit, mert egy ilyen feladaton is sokat lehet tanulni, mert hát nagyon sokféleképpen meglehet oldani és vannak C++-osabb megoldások.

    Következő verzió mondjuk legyen egy olyan, ahol az osztályodnak implementálsz egy 'operator>>'-t a beolvasáshoz!
    Stream extraction and insertion

    Tehát implementálod és használod az alábbi funkciót:

    istream& operator>>(istream&, Szemely&);
    Mutasd a teljes hozzászólást!
  • Köszönöm. 
    Ez még sok nekem, de szeretnék eljutni ide is.
    Mutasd a teljes hozzászólást!
Címkék
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd