NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Problém se seznamy a soubory

V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Ilja Židkov
Člen
Avatar
Ilja Židkov:23.12.2016 11:17

Dobrý den,

chtěl bych s vámi sdílet jeden problém v podmínce při zařazení do seznamu. Úloha zněla:
Máme 3 vstupy (3x ifstream) - všechna mužská jména.txt, všechna ženská jména.txt a jména nájemců koleje.txt.
Musíme dostat 3 výstupy (3x ofstream) - 1. ofstream porovná všechna mužská jména.txt a jména nájemců koleje.txt --> shodu vypíše do V3_MuzskaJmena.txt,
2. ofstream porovná všechna ženská jména.txt a jména nájemců koleje.txt. --> shodu vypíše do V3_ZenskaJmena.txt,
3.ofstream projede mužská a ženská jména a jestliže, jméno nájemců.txt nesouhlasí s mužským ani ženským jménem, vypiš do --> Neurceno.txt.
Vše funguje až Neurceno.txt (chyba je zdůrazněna v kódu u s6), program se přeloží bez chyb, ale do Neurceno.txt nic nevypíše (i když do nájemců koleje napíšu nesmyslná jména tak program stejně nereaguje...)

Děkuji za jakoukoliv pomoc :)

Deklarace:


#ifndef DEKLARACE_H
#define DEKLARACE_H
#include <string>
using std::string;

class MuzskaJmena {

private:
        string jmeno;

public:
        MuzskaJmena(string jmeno);
        string DejJmeno();

};

//------------------------------------------------------------------------------

class ZenskaJmena {

private:
        string jmeno;

public:
        ZenskaJmena(string jmeno);
        string DejJmeno();

};

//------------------------------------------------------------------------------

class Najemci {

private:
        string jmeno;
        string prijmeni;

public:
        Najemci(string jmeno, string prijmeni);
        string DejJmeno();
        string DejPrijmeni();

};

//------------------------------------------------------------------------------

class V3_MuzskaJmena {

private:
        string jmeno;
        string prijmeni;

public:
        V3_MuzskaJmena(string jmeno, string prijmeni);
        string DejJmeno();
        string DejPrijmeni();

};

//------------------------------------------------------------------------------

class V3_ZenskaJmena {

private:
        string jmeno;
        string prijmeni;

public:
        V3_ZenskaJmena(string jmeno, string prijmeni);
        string DejJmeno();
        string DejPrijmeni();

};

//------------------------------------------------------------------------------

class Neurceno {

private:
        string jmeno;
        string prijmeni;

public:
        Neurceno(string jmeno, string prijmeni);
        string DejJmeno();
        string DejPrijmeni();

};

#endif

Definice:


#include "Deklarace.h"

MuzskaJmena::MuzskaJmena(string jmeno) {
        this->jmeno = jmeno;
}

string MuzskaJmena::DejJmeno() {
        return this->jmeno;
}

//------------------------------------------------------------------------------

ZenskaJmena::ZenskaJmena(string jmeno) {
        this->jmeno = jmeno;
}

string ZenskaJmena::DejJmeno() {
        return this->jmeno;
}

//------------------------------------------------------------------------------

Najemci::Najemci(string jmeno, string prijmeni) {
        this->jmeno = jmeno;
        this->prijmeni = prijmeni;
}

string Najemci::DejJmeno() {
        return this->jmeno;
}

string Najemci::DejPrijmeni() {
        return this->prijmeni;
}

//------------------------------------------------------------------------------


V3_MuzskaJmena::V3_MuzskaJmena(string jmeno, string prijmeni) {
        this->jmeno = jmeno;
        this->prijmeni = prijmeni;
}

string V3_MuzskaJmena::DejJmeno() {
        return this->jmeno;
}

string V3_MuzskaJmena::DejPrijmeni() {
        return this->prijmeni;
}

//------------------------------------------------------------------------------

V3_ZenskaJmena::V3_ZenskaJmena(string jmeno, string prijmeni) {
        this->jmeno = jmeno;
        this->prijmeni = prijmeni;
}

string V3_ZenskaJmena::DejJmeno() {
        return this->jmeno;
}

string V3_ZenskaJmena::DejPrijmeni() {
        return this->prijmeni;
}

//------------------------------------------------------------------------------

Neurceno::Neurceno(string jmeno, string prijmeni) {
        this->jmeno = jmeno;
        this->prijmeni = prijmeni;
}

string Neurceno::DejJmeno() {
        return this->jmeno;
}

string Neurceno::DejPrijmeni() {
        return this->prijmeni;
}

Main:


#include "Deklarace.h"
#include <iostream>
#include <fstream>
#include <list>
using namespace std;

int main() {

        // Lokalize češtiny:
        setlocale(LC_ALL, "czech");

        // Seznam s1:
        list <MuzskaJmena*> s1;

        ifstream proud1("Krestni_jmena_muzska.txt");

        // Ošetření existence proudu1:
        if (!proud1) {
                cout << "Chyba nacteni souboru.";
                return -1;
        }

        // Ziskani dat ze seznamu s1:
        string jmeno1;
        while (proud1 >> jmeno1) {
                s1.push_back(new MuzskaJmena(jmeno1));
        }

        proud1.close();

        // Výpis souboru
        list <MuzskaJmena*>::iterator it1 = s1.begin();
        /*while (it1 != s1.end()) {
                cout << (*it1)->DejJmeno() << endl;
                it1++;
        }*/

        //------------------------------------------------------------------------------

        // Seznam s2:
        list <ZenskaJmena*> s2;

        ifstream proud2("Krestni_jmena_zenska.txt");

        // Ošetření existence proudu2:
        if (!proud2) {
                cout << "Chyba nacteni souboru.";
                return -1;
        }

        // Ziskani dat ze seznamu s2:
        string jmeno2;
        while (proud2 >> jmeno2) {
                s2.push_back(new ZenskaJmena(jmeno2));
        }

        proud2.close();

        // Výpis souboru
        list <ZenskaJmena*>::iterator it2 = s2.begin();
        /*while (it2 != s2.end()) {
                cout << (*it2)->DejJmeno() << endl;
                it2++;
        }*/

        //------------------------------------------------------------------------------

        // Seznam s3:
        list <Najemci*> s3;

        ifstream proud3("Najemci.txt");

        // Ošetření existence proudu3:
        if (!proud3) {
                cout << "Chyba nacteni souboru.";
                return -1;
        }

        // Ziskani dat ze seznamu s3:
        string jmeno3;
        string prijmeni3;
        while (proud3 >> jmeno3 >> prijmeni3) {
                s3.push_back(new Najemci(jmeno3, prijmeni3));
        }

        proud3.close();

        // Výpis souboru
        list <Najemci*>::iterator it3 = s3.begin();
        /*while (it3 != s3.end()) {
                cout << (*it3)->DejJmeno() << " " << (*it3)->DejPrijmeni() << endl;
                it3++;
        }*/

        //------------------------------------------------------------------------------

        // Seznam s4:
        list <V3_MuzskaJmena*> s4;

        // Nastaveni iterátorů na počátek:
        it1 = s1.begin();
        while (it1 != s1.end()) {
                it3 = s3.begin();
                while (it3 != s3.end()) {
                        if ((*it1)->DejJmeno() == (*it3)->DejJmeno()) {
                                s4.push_back(new V3_MuzskaJmena((*it3)->DejJmeno(), (*it3)->DejPrijmeni()));
                        }
                        it3++;
                }
                it1++;
        }

        // Výpis nájemců (mužů) do souboru:
        ofstream proud4("V3_MuzskaJmena.txt");

        list<V3_MuzskaJmena*>::iterator it4 = s4.begin();
        proud4 << "JMÉNO | PŘÍJMENÍ" << endl;
        while (it4 != s4.end()) {
                proud4 << (*it4)->DejJmeno() << " " << (*it4)->DejPrijmeni() << endl;
                it4++;
        }
        proud4.close();

        cout << s4.size() << endl;

        //------------------------------------------------------------------------------

        // Seznam s5:
        list <V3_ZenskaJmena*> s5;

        /*Nastaveni iterátorů na počátek:*/
        it2 = s2.begin();
        while (it2 != s2.end()) {
                it3 = s3.begin();
                while (it3 != s3.end()) {
                        if ((*it2)->DejJmeno() == (*it3)->DejJmeno()) {
                                s5.push_back(new V3_ZenskaJmena((*it3)->DejJmeno(), (*it3)->DejPrijmeni()));
                        }
                        it3++;
                }
                it2++;
        }

        // Výpis nájemců (žen) do souboru:
        ofstream proud5("V3_ZenskaJmena.txt");

        list<V3_ZenskaJmena*>::iterator it5 = s5.begin();
        proud5 << "JMÉNO | PŘÍJMENÍ" << endl;
        while (it5 != s5.end()) {
                proud5 << (*it5)->DejJmeno() << " " << (*it5)->DejPrijmeni() << endl;
                it5++;
        }
        proud5.close();

        cout << s5.size() << endl;

        //------------------------------------------------------------------------------

        // Seznam s6:
        list <Neurceno*> s6;

        // Nastavení iterátorů na počátek:
        it1 = s1.begin();
        while (it1 != s1.end()) {
                it2 = s2.begin();
                while (it2 != s2.end()) {
                        it3 = s3.begin();
                        while (it3 != s3.end()) {
                                if ((*it1)->DejJmeno() != (*it3)->DejJmeno() && (*it2)->DejJmeno() != (*it3)->DejJmeno()) {  // <--- ZDE JE CHYBA
                                        s6.push_back(new Neurceno((*it3)->DejJmeno(), (*it3)->DejPrijmeni()));
                                }
                                it3++;
                        }
                        it2++;
                }
                it1++;
        }


        // Výpis nájemců (neurčeno) do souboru:
        ofstream proud6("Neurceno.txt");

        list<Neurceno*>::iterator it6 = s6.begin();
        proud6 << "JMÉNO | PŘÍJMENÍ" << endl;
        while (it6 != s6.end()) {
                proud6 << (*it6)->DejJmeno() << " " << (*it6)->DejPrijmeni() << endl;
                it6++;
        }
        proud6.close();

        cout << s6.size() << endl;

        cin.get();
        return 0;
}
Editováno 23.12.2016 11:17
 
Odpovědět
23.12.2016 11:17
Avatar
Petr Nymsa
Tvůrce
Avatar
Odpovídá na Ilja Židkov
Petr Nymsa:23.12.2016 11:25

A co krom ofstream si to vypisovat do konzole at vidíš jestli ti to vůbec data nacte?
Dal si dej pozor na memory-leaky.

Nahoru Odpovědět
23.12.2016 11:25
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Ilja Židkov
Člen
Avatar
Odpovídá na Petr Nymsa
Ilja Židkov:23.12.2016 11:52

Zkoušel jsem (proto některé výpisy jsem zakomentoval).

 
Nahoru Odpovědět
23.12.2016 11:52
Avatar
Ilja Židkov
Člen
Avatar
Ilja Židkov:29.12.2016 17:33

Problém vyřešen.

 
Nahoru Odpovědět
29.12.2016 17:33
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 4 zpráv z 4.