Pereiti prie turinio

C++ Prolemos su skaitymu is failo


Rekomenduojami pranešimai

Sveiki, turiu tekstini failiuka

2b pirmadienis 5 kuno kultura
2b antradienis 3 kuno kultura
2b treèiadienis 4 x 
2b ketvirtadienis 4 kuno kultura
2b penktadienis 2 x
2c pirmadienis 2 x
2c antradienis 4 kuno kultura
2c treèiadienis 4 kuno kultura
2c ketvirtadienis 1 kuno kultura
2c penktadienis 2 

is kurio turiu nuskaityti failus. Beda ta kad nezinau ribu (siuo atveju 10, nes n=10(is viso 10 eiluciu)) zinau kad galima tai padaryti su while(!fd.eof()), bet man reikia ne to. Ar imanoma kazkaip nuskaityti su for ciklu nezinant kiek yra elementu ir kad veliau juos butu imanoma pasiekti per ivairiausius parametrus. Nezinau ar supratot nes labai sunku isaiskinti ko man reikia.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Imesiu dali kodo. Greiciausiai suprasit kodel sis variantas netinka

void Pamokos(const char AB[], Pamoka p[]){
string klase, diena, pamoka;
   int nr;
ifstream fd1(AB);
while(!fd1.eof()){
	fd1 >> klase >> diena >> nr >> pamoka;
	p[].Deti(klase, diena, nr, pamoka); // p[(va cia man reikia kazkaip padaryti kad veliau galeciau pasiekti siuos elementus)].Deti(klase, diena, nr, pamoka);
}
fd1.close();
}

 

Susigalvoojau ir toki vraianta (manau kad nesamone, nes programa nuluzta bet kazkas tokio pagal logika turetu buti)

void Pamokos(const char AB[], Pamoka p[], int & n){
string klase, diena, pamoka;
   int nr;
ifstream fd1(AB);
int i=0;
while(!fd1.eof()){
	fd1 >> klase >> diena >> nr >> pamoka;
	p[i].Deti(klase, diena, nr, pamoka);
	i++;
}
fd1.close();
}

Redagavo mendinskis
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Gerai perrašei, bet gali ir mandriau. Vietoj "p.Deti" parašyk "p[i++].Deti". Sutaupysi viena eilutę kodo. O lūžti gali dėl to, kad faile eilutės pabaigoje yra tarpas. Bent jau taip man per paskaitų laborus dažniausiai būdavo. Ir iš pačio rašymo, tai atrodo KTU studijuoji :)

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Tavo pamokų pavadinimai yra du žodžiai, o "failas >> x" berods skaito iki tarpo ar kitokio whitespace... Pilnai gali lūžti dėl to – viskas „nusivažiuoja“ per kokią vietą ir bando dėti ne į tą kintamąjį, kur reikia (pvz. stringą į int).

 

Vietoj to, skaityk pamoką iki eilutės galo. (Apskritai, pasimokyk C++ I/O savarankiškai)

 

Gerai perrašei, bet gali ir mandriau. Vietoj "p.Deti" parašyk "p[i++].Deti". Sutaupysi viena eilutę kodo.

Na o dar labiau sutaupytum viską sumetęs į vieną eilutę :D Kodo eilutės – ne pinigai, taupyt nereikia. IMO kaip žmogui geriau ir įskaitomiau, taip ir daro. Jei kada prireiktų ant to paties elemento daryt du veiksmus (p.Deti(), p.DarKazkas()), tai vėl nebetiktų i++ skliaustuose... :)

Redagavo Silke
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Tavo pamokų pavadinimai yra du žodžiai, o "failas >> x" berods skaito iki tarpo ar kitokio whitespace... Pilnai gali lūžti dėl to – viskas „nusivažiuoja“ per kokią vietą ir bando dėti ne į tą kintamąjį, kur reikia (pvz. stringą į int).

 

Vietoj to, skaityk pamoką iki eilutės galo. (Apskritai, pasimokyk C++ I/O savarankiškai)

 

 

Na o dar labiau sutaupytum viską sumetęs į vieną eilutę :D Kodo eilutės – ne pinigai, taupyt nereikia. IMO kaip žmogui geriau ir įskaitomiau, taip ir daro. Jei kada prireiktų ant to paties elemento daryt du veiksmus (p.Deti(), p.DarKazkas()), tai vėl nebetiktų i++ skliaustuose... :)

Luzta tikrai ne del to. Jau sita apgalvojes buvau pamoku pavadinimus surasiau i viena zodi pvz kunokultura.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Ikeliu savo duomenu faila

2b pirmadienis 5 kūnokultūra

2b antradienis 3 kūnokultūra

2b trečiadienis 4 x

2b ketvirtadienis 1 kūnokultūra

2b penktadienis 2 x

2c pirmadienis 5 kūnokultūra

2c antradienis 4 kūnokultūra

2c trečiadienis 4 kūnokultūra

2c ketvirtadienis 1 kūnokultūra

2c penktadienis 2 x

cia 2b ir 2c yra mokiniu klasiu numeriai (juos rasau i string klases) pirmadienis-penktadienis (string diena) 3,4 ir t.t. pamokos numeris rasau i (int nr) ir kunokultura (string pamoka)

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Na man su tavo failu ir tokiu kodu

#include <iostream>
#include <fstream>

using namespace std;

int main() {
   ifstream in("duom.txt");
   string klase, diena, pamoka;
   int nr;
   while (!in.eof()) {
       in >> klase >> diena >> nr >> pamoka;
       cout << klase << " " << diena << " " << nr << " " << pamoka << endl;
   }
}

 

Nelūžta. Vadinasi, ne skaityme bėda. Apskritai, duok visą informaciją, jei nori, kad padėtume. Koks klasės kodas? (problema gali būti būtent joje, nes šiaip skaitymas yra OK). Kurioj eilutėj išvis lūžta? (pasipraktikuok debuggerio skillus :)).

 

Neturėdami pilno, veikiančio tavo programos kodo, o tik tą vietą (kurioje greičiausiai nėra klaidos), niekaip nepadėsim.

Redagavo Silke
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Menkos mano C++ žinios, bet būtų panašu, kad Pamoka::Deti() bando užsettinti kintamuosius ant klasės (kaip statinius?), o ne ant instancijos (this)... Kodėl?! :blink: :blink: :blink:

 

#include <iostream>
#include <fstream>

using namespace std;

class Pamoka
{
private:
   string klase;
   string diena;
   int nr;
   string pamoka;

public:
   void Deti(string klase, string diena, int nr, string pamoka);
   string ImtiKlase(){return klase;}
   string ImtiDiena(){return diena;}
   int ImtiNr(){return nr;}
   string ImtiPamoka(){return pamoka;}
};

void Pamoka::Deti(string klase, string diena, int nr, string pamoka){
   this->klase = klase;
   this->diena = diena;
   this->nr = nr;
   this->pamoka = pamoka;
}

int main() {
   ifstream in("duom.txt");
   string klase, diena, pamoka;
   int nr;

   Pamoka pamokos[123];

   int i = 0;
   while (!in.eof()) {
       in >> klase >> diena >> nr >> pamoka;
       pamokos[i].Deti(klase, diena, nr, pamoka);
       i++;
   }
   cout << pamokos[0].ImtiPamoka() << endl;
}

 

Puikiai veikia.

 

Tiesa, kodėl naudoji pvz "diena2" ir "diena3" atskirose klasėse? Juk vardai pilnai gali kartotis atskirose klasėse, funkcijose, etc. :)

 

Žodžiu, trūksta C++ OOP pagrindų.

Redagavo Silke
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Ju dar nera net manau... Objektini programavima neseniai padejome is pradziu taip sunku neatrode :D Beje Tu jau baiges univeristeta? Ir kur studijuoji (klasuiu tik del idomumo) :)

Na, nežinant sunku pasakyti, ar dėstytojas nepakankamai paaiškina, ar gal pats pramigai ką nors :)

 

O aš dvyliktokas kol kas.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Turiu dar viena klausima. http://pastebin.com/5u9hkw6K visa tai ka nusiskaiciau noriu kad butu irasyta i void SpausdintiPamokas, bet man vel programa uzlusta. Kas negerai su for ciklu viskas veikia.

Skaitai pamokas, bet iš Klases.txt?

const char AB[] = "Klases.txt"; // duom     
...
Pamokos(AB, p, i);            

 

Pasidaryk protingesnius, prasmingesnius konstantų vardus ir nesusimaišysi taip. Ir dar – su debuggeriu klaidų ieškoti yra paprasta ir efektyvu, priešingai, nei tiesiog spėliojant :)

 

+ SpausdintiPamokas dar viena klaida – tu juk neskaitai iš failo, tai kam tas ifstream? Kai neskaitai iš jo, tai niekada nebus fd1.eof(), taip peržengi rėžius su begaliniu ciklu ir dėl to crashinasi. (čia jau pataisius failo vardą)

 

Tiesiog eik per mąsyvą su for ciklu (aišku, limituok pamokų skaičių iki tiek, kiek perskaitei – kažkur išsisaugok tą skaičių)

Redagavo Silke
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Aciu, turbut atsibosiu su tokiais klausimais taciau koregavau koda (kad butu galima skaityti ir isvesti bei atidaryti koda papildymui ir t.t.) bet isvedus i ekrana kad ir suma (sum) ja meta 1, nors turetu buti 10. Kazkaip niekaip nenuskaito duomenu is tekstinio failo. Su tuo while(fd.eof()) niekada nieko buvau nedares tai itariu kad kazkas negerai su paciu ciklu. http://pastebin.com/PtW3T9z7

Redagavo mendinskis
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Greiciausiai jau supratau.... As skaitau duomenis while(!fd.eof()) tai cia reiskia kad skaito iki failo pabaigos o man reikia iki eilutes. Tik dabar bandau nusiskaityti eilute su getline f-ja taciau men meta klaida ir neatpazysta to getline. Ar yra kokia specifine biblioteka eilutes nuskaitymui?

Redagavo mendinskis
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Aciu, turbut atsibosiu su tokiais klausimais taciau koregavau koda (kad butu galima skaityti ir isvesti bei atidaryti koda papildymui ir t.t.) bet isvedus i ekrana kad ir suma (sum) ja meta 1, nors turetu buti 10. Kazkaip niekaip nenuskaito duomenu is tekstinio failo. Su tuo while(fd.eof()) niekada nieko buvau nedares tai itariu kad kazkas negerai su paciu ciklu. http://pastebin.com/PtW3T9z7

Nu pas mane tai viskas normaliai, tikrink duomenų failą, debugink, kažkas kažkur ne taip

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Iš #8 posto nukopinau

 

Radau klaidelę, pasirodo neįrašo duomenų į objektą

void Pamoka::Deti(string klase, string diena, int nr, string pamoka){
        this->klase=klase;
        this->diena=diena;
        this->nr=nr;
        this->pamoka=pamoka;
}

O kur cia klaida? Kaip pas Tave veike tada?

Redagavo mendinskis
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Pas tave buvo taip:

void Pamoka::Deti(string klase, string diena, int nr, string pamoka){
       klase=klase;
       diena=diena;
       nr=nr;
    pamoka=pamoka;
}

 

This pointeris nurodo pačios klasės kintamąjį. Kadangi tavo metode parametrų vardai nesiskiria nuo klasėje aprašytų vardų, kompiliatorius galvoja, kad tu dirbi su metodo parametrais, o ne klasės kintamaisiais.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

  • Prisijunk prie bendruomenės dabar!

    Uždarbis.lt nariai domisi verslo, IT ir asmeninio tobulėjimo temomis, kartu sprendžia problemas, dalinasi žiniomis ir idėjomis, sutinka būsimus verslo partnerius ir dalyvauja gyvuose susitikimuose.

    Užsiregistruok dabar ir galėsi:

    ✔️ Dalyvauti diskusijose;

    ✔️ Kurti naujas temas;

    ✔️ Rašyti atsakymus;

    ✔️ Vertinti kitų žmonių pranešimus;

    ✔️ Susisiekti su bet kuriuo nariu asmeniškai;

    ✔️ Naudotis tamsia dizaino versija;

    ir dar daugiau.

    Registracija trunka ~30 sek. ir yra visiškai nemokama.

  • Naujausios temos

  • Karštos temos

×
×
  • Pasirinkite naujai kuriamo turinio tipą...