Školní projekt v C++ Filmotéka – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Školní projekt v C++ Filmotéka – C / C++ – Fórum – Programujte.comŠkolní projekt v C++ Filmotéka – C / C++ – Fórum – Programujte.com

 

Ondra
~ Anonymní uživatel
244 příspěvků
11. 12. 2014   #1
-
0
-

Dobrý den, mám problém se školním prjektem. Za úkol mám vytvořit databázi filmů.

Celé zadání:

**************************************************************************************************************************

Vytvořte filmotéku, která bude načítat data ze dvou CSV souboru. První soubor bude obsahovat seznam filmů, nejméně položky:

ID,
název,
rok,
žánr,
původ,
trvání,
ID_herců,

a druhý bude obsahovat seznam herců; nejméně položky:

ID,
jméno,
příjmení,
datum_narození,
místo_narození.

Položka ID_herců (u filmu) bude obsahovat seznam ID herců, kteří ve filmu hráli (oddělený mezerami). Program umožní tyto akce:

vypíše do konzole seznam všech filmů, filmy určitého žánru a filmy natočené v určitých letech (interval od-do);
vypíše informace o filmu po zadání ID nebo názvu filmu (včetně jmen herců, kteří ve filmu hráli);
vypíše informace o herci po zadání ID nebo jména herce (včetně všech filmů, ve kterých hrál).

Každá z akcí umožní export do HTML souboru.

************************************************************************************************************************************

Vůbec netuším jak na to :( s C jsem absolutní začátečník :/ Můj nápad byl vytvořit dvě struktury, v jedné informace o filmu a v druhé info o hercích a pak nějakým způsobem načíst potřebné sloupce a řádky z obou CSV a uložit je asi do pole těch dvou struktur. Poradil by mi někdo jak na to nejlepší a nejjednodušší cestou? Fakt si nevím rady

Nahlásit jako SPAM
IP: 77.48.31.–
ondrej39+1
Věrný člen
11. 12. 2014   #2
-
0
-

#1 Ondra
Budeš mít dva objekty, film a herec, jak píšeš. Skoro všechny proměnné jsou normální typy, akorát ID_herců v objektu film bude asi nejjednodušší implementovat jako vector ukazatelů na objekty herec (je lepší to udělat jako ukazatel, protože pak když jeden herec bude hrát ve více filmech můžeš změnit pouze parametry daného objektu herec a aktualizuje se ti to ve všech filmech).

Nahlásit jako SPAM
IP: 195.113.207.–
Inject all the dependencies!
Ondra
~ Anonymní uživatel
244 příspěvků
11. 12. 2014   #3
-
0
-

 Zkusil jsem ale netuším jestli je to dobře

#include <iostream>
#include <sstream>
#include <fstream>
#include <vector>
#include <string>
#include <iomanip>
#include <stdio.h>
#include <string.h>

using namespace std;

typedef struct filmy {
        int id;
        string nazev;
        string rokVydani;
        string zanr;
        string puvod;
        int trvani;
        int *idHerce;
} filmy;

typedef struct herci {
        int id;
        string jemno;
        string prijmeni;
        string rokNarozeni;
        string mistoNarozeni;
} herci;

int main ()
{
    vector<herci>idHerce;

    return 0;
}
Nahlásit jako SPAM
IP: 77.48.31.–
ondrej39+1
Věrný člen
11. 12. 2014   #4
-
0
-

#3 Ondra
Deklaraci vektoru v mainu máš dobře, tak se skutečně vytvoří vektor s objekty herci, ale 1) ty potřebuješ mít ten vektor přímo ve struktuře film (každý film má jiné herce) a 2) nechceš mít vektor objektů herci, ale vektor ukazatelů na objekty herci (spojené s tím, jak už jsem psal...)

Například budeš mít dva filmy (tedy dva objekty typu film) - Harry Potter 1 a Harry Potter 2, v obou z nich hraje Emma Watson, která se narodila v roce 1990 (takže budeš mít ještě jeden objekt herec emma_watson). Pokud bys měl seznam herců v daném filmu řešený pouze přes vektor objektů, tak kdybys chtěl změnit rok narození Emmy Watson, musíš to udělat pro všechny filmy, v nichž herečka hraje.

Když ale budeš mít obsazení řešené jako ukazatele na objekty typu herec, tak stačí změnit rok narození v objektu herec emma_watson a změní se to automaticky i ve všech filmech, v nichž Emma Watson hraje.

(Doufám, že to chápu dobře, vektorům rozumím tak napůl, ale jsem si svou teorií jistý tak na 98%. Kdyby to bylo špatně, tak se omlouvám. Taky neprogramuji nijak dlouho :D.)

Takže budeš mít strukturu filmy a v ní vektor ukazatelů na objekt herci...

struct film {
        int id;
        string nazev;
        string rokVydani;
        string zanr;
        string puvod;
        int trvani;
	vector<herci *>obsazeni; // zde je vektor herců
} ;

P.S. Jen připomínám, že tímto neřešíš filmotéku, ale zatím pouze řešíš M:N vazbu film<->herec, nicméně filmotéka se pak dá udělat obdobným způsobem -> akorát budeš mít vektor objektů film.

Nahlásit jako SPAM
IP: 213.226.234.–
Inject all the dependencies!
Ondra
~ Anonymní uživatel
244 příspěvků
11. 12. 2014   #5
-
0
-

:D aha začínám v tom mít trochu zmatek ale zatím asi chápu, ještě se chci zeptat, jak udělám to, aby se mi do jednotlivých objektů obou struktur načetly položky z CSV souborů filmy.csv a herci.csv, tak  abych s ni mi pak dále mohl pracovat (vypisovat a třídit) podle zadání? :/

Nahlásit jako SPAM
IP: 77.48.31.–
ondrej39+1
Věrný člen
11. 12. 2014   #6
-
0
-

#5 Ondra
S csv ssoubory jsem nepracoval, ale asi to bude stejné jako práce s jakýmkoli jiným vstupním souborem - musíš vhodně načíst z jeho struktury data do proměnných.

Co se výpisu filmů daného žánru nebo filmů natočených v určitém intervalu, pokud budeš mít filmotéku řešenou opět jako vektor filmů, tak prostě ten vektor iterátorem projedeš a když se splní podmínka film nacházející se na aktuální pozici iterátoru vypíšeš.

Zítra bych se ti na to podíval, pokud to nespěchá a mezitím to neudělá někdo jiný.

Nahlásit jako SPAM
IP: 37.188.232.–
Inject all the dependencies!
11. 12. 2014   #7
-
0
-

číst soubor po řádcích - můžeš použít fgets a načtený řádek rozdělit do struktury pomocí strtok. Oddělovačem u csv bývá ; (středník). Druhá možnost je naprogramovat stavový automat, který bude soubor číst po znacích a vkládat položky do struktur přímo.

Rok vydání rok narození mohou být int.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Ondra
~ Anonymní uživatel
244 příspěvků
11. 12. 2014   #8
-
0
-

#6 ondrej39
Budu rád za každou pomoc, celý den hledám a zkouším a začínám být zoufalý :D díky moc :) zatím to nespěchá :)

Nahlásit jako SPAM
IP: 77.48.31.–
Jurin
~ Anonymní uživatel
16 příspěvků
11. 12. 2014   #9
-
0
-

   

typedef std::vector<std::string>			T_RowString;
typedef std::vector<T_RowString>			T_TableString;

bool CSV_Read(const std::string &inFileName,char inSeparator,T_TableString &outTable)
{
	using namespace std;

	outTable.clear();

	ifstream file(inFileName.c_str());
	while (file.good())
	{
		string sLine;
		getline(file,sLine);

		std::istringstream lineStream(sLine);

		T_RowString row;
		string sCell;
		while ( getline(lineStream,sCell,inSeparator) )
			row.push_back(sCell);

		if ( !row.empty() )
			outTable.push_back(row);
	}

	return true;
}
Nahlásit jako SPAM
IP: 84.242.99.–
ondrej39+1
Věrný člen
11. 12. 2014   #10
-
0
-

#9 Jurin
Myslím si, že toto řešení není úplně vhodné. Nebude llepší načítat data ze souboru přímo do konkrétních objektů (film, herec)?

Nahlásit jako SPAM
IP: 46.39.172.–
Inject all the dependencies!
Ondra
~ Anonymní uživatel
244 příspěvků
11. 12. 2014   #11
-
0
-

 Zkouším funkce fgets a strtok ale asi to nebude úplně tak jak by to mělo být :/

#include <iostream>
#include <sstream>
#include <fstream>
#include <vector>
#include <string>
#include <iomanip>
#include <stdio.h>
#include <string.h>
#include <vector>
#include <cstdio>

using namespace std;

struct herci {
        int id;
        string jemno;
        string prijmeni;
        int rokNarozeni;
        string mistoNarozeni;
} ;

struct film {
        int id;
        string nazev;
        int rokVydani;
        string zanr;
        string puvod;
        int trvani;
	vector<herci *>obsazeni; // zde je vektor hercù
} ;

int main ()
{

    FILE *vstup1, *vstup2;
    char filmy[1024];

    vstup1 = fopen ("filmy.csv", "r");
    vstup2 = fopen ("herci.csv", "r");

    while(vstup1 != NULL) {
        if ( fgets (filmy , 1024 , vstup1) != NULL )
            film.id = strtok(vstup1, ";");
            film.nazev = strtok(vstup1, ";");
            film.rokVydani = strtok(vstup1, ";");
            film.zanr = strtok(vstup1, ";");
            film.id = strtok(vstup1, ";");
            film.puvod = strtok(vstup1, ";");
            film.trvani = strtok(vstup1, ";");
    }

   return 0;
}
Nahlásit jako SPAM
IP: 77.48.31.–
ondrej39+1
Věrný člen
11. 12. 2014   #12
-
0
-

#11 Ondra
Tak určitá implementace může vypadat následovně...

#include "stdafx.h"
#include <iostream>
#include <string>
#include <vector>

#define SOUBOR_FILMY "herci.csv"
#define SOUBOR_FILMY "filmy.csv"

struct Herec {
	int id_;
	std::string jmeno_;
	std::string prijmeni_;
	std::string datum_narozeni_;
	std::string misto_narozeni_;
};

struct Film {
	int id_;
	std::string nazev_;
	int rok_;
	std::string zanr_;
	std::string puvod_;
	int trvani_;
	std::vector<Herec *>obsazeni_;

	void detail_filmu()
	{
		std::cout << id_ << ": " << nazev_ << " (" << zanr_ << ")" << std::endl;
		std::cout << std::endl;
		std::cout << "Natocen ........: " << rok_ << std::endl;
		std::cout << "Zeme puvodu ....: " << puvod_ << std::endl;
		std::cout << "Delka filmu ....: " << trvani_ << " minut" << std::endl;
		std::cout << std::endl;
		std::cout << "Ucinkuji: "; vypis_herce();
		std::cout << std::endl;
		std::cout << std::endl;
	}

	void vypis_herce()
	{
		for (unsigned int i = 0; i < obsazeni_.size(); i++)
			std::cout << obsazeni_[i]->jmeno_ << " " << obsazeni_[i]->prijmeni_ << ", ";
	}
};

struct Filmoteka {	
	std::vector<Film *>seznam_filmu_;

	void vypis_filmy()
	{
		for (unsigned int i = 0; i < seznam_filmu_.size(); i++)
			seznam_filmu_[i]->detail_filmu();
	}
};

int main()
{
	Filmoteka filmova_databaze;

#pragma region Herec_emma_watson
	Herec * emma_watson = new Herec;

	emma_watson->datum_narozeni_ = 1234;
	emma_watson->id_ = 15;
	emma_watson->jmeno_ = "Emma";
	emma_watson->prijmeni_ = "Watson";
	emma_watson->misto_narozeni_ = "Zemekoule";
#pragma endregion 

#pragma region Herec_leonardo_dicaprio
	Herec * leonardo_dicaprio = new Herec;

	leonardo_dicaprio->datum_narozeni_ = 12634;
	leonardo_dicaprio->id_ = 18;
	leonardo_dicaprio->jmeno_ = "Leonardo";
	leonardo_dicaprio->prijmeni_ = "DiCaprio";
	leonardo_dicaprio->misto_narozeni_ = "Zemekoule";
#pragma endregion

#pragma region Herec_tom_cruise
	Herec * tom_cruise = new Herec;

	tom_cruise->datum_narozeni_ = 134;
	tom_cruise->id_ = 22;
	tom_cruise->jmeno_ = "Tom";
	tom_cruise->prijmeni_ = "Cruise";
	tom_cruise->misto_narozeni_ = "Zemekoule";
#pragma endregion

#pragma region film1
	Film film1;

	film1.id_ = 1;
	film1.nazev_ = "Babovresky";
	film1.puvod_ = "Ceska republika";
	film1.rok_ = 1992;
	film1.trvani_ = 96;
	film1.zanr_ = "Krimi";
	
	film1.obsazeni_.push_back(emma_watson);
	film1.obsazeni_.push_back(tom_cruise);	
#pragma endregion

#pragma region film2
	Film film2;

	film2.id_ = 1;
	film2.nazev_ = "Titanic";
	film2.puvod_ = "USA";
	film2.rok_ = 1993;
	film2.trvani_ = 113;
	film2.zanr_ = "Komedie";

	film2.obsazeni_.push_back(tom_cruise);
	film2.obsazeni_.push_back(leonardo_dicaprio);
#pragma endregion

	// naplnění filmové databáze danými filmy (film1 a film2)
	filmova_databaze.seznam_filmu_.push_back(&film1);
	filmova_databaze.seznam_filmu_.push_back(&film2);

	// tisknu databazi filmu
	filmova_databaze.vypis_filmy();		

	std::cout << "Menim prijmeni Watson -> Novakova" << std::endl;
	emma_watson->prijmeni_ = "Novakova";

	// tisknu databazi se zmenenym prijmenim Watson->Novakova
	filmova_databaze.vypis_filmy();

	return 0;	
}

Nemám tam načítání ze souboru a ukládání do něj, toto ber jen jako nástřel a zorientování, jak vlastně vektory fungují a jak by mohla vypadat tvá filmotéka.

Já si navíc definuji strukturu Filmoteka, která obsahuje vektor těch filmů, tu si definovat nemusíš, můžeš si přímo v mainu udělat vektor se stejným typem a pojmenovat si ho např. filmoteka_1, filmoteka_2,...

Jinak si všimni, že skoro u konce měním pouze objekt Herec (změna toho příjmení), ale samotné objekty Film a Filmotéka neměním, nicméně je v nich příjmení nové a to je právě díky tomu, že nemáš vektor objektů, ale vektor těch ukazatelů na dané objekty.

P.S. Doporučuji s vedoucím předmětu prodiskutovat, zda je vůbec takové řešení, řešení pomocí vektorů, možné použít, abys ti nebyly zbytečně strhnuty body.

Nahlásit jako SPAM
IP: 46.39.172.–
Inject all the dependencies!
Ondra
~ Anonymní uživatel
244 příspěvků
12. 12. 2014   #13
-
0
-

#12 ondrej39
Tyo díky moc :) vypadá to dobře :) Tak ono je mu asi celkem fuk jak to budu mít řešený, hlavně ať to funguje a rozumím tomu kódu což když se na to podívám tak tomu i celkem rozumím, teď jen dořešit to načítání a použití dat ze souboru

Nahlásit jako SPAM
IP: 217.197.149.–
Ondra
~ Anonymní uživatel
244 příspěvků
12. 12. 2014   #14
-
0
-

 Našel jsem si nějaké dvě fukce, které by měly vyřešit načítání a výpis souborů, jen mi to hazí chybu u funkce "strcpy()" :

cannot convert 'std::string {aka std::basic_string<char>}' to 'char*' for argument '1' to 'char* strcpy(char*, const char*)'

Nevíte někdo co je tam špatně? :(

Film  *nacteniFilmu(Film *poleFilmu,int &velikostPole,string &filtr)
{
	string kopieRretezec;
	string nazevSouboru = "filmy";
	//string cesta="../../vstupnidata/";
	string pripona=".csv";
	int cisloZaznamu=0;

	system("cls");
	cout<<"Zadej nazev souboru bez pripony, ktery chces nacist: ";
	//cin>>nazevSouboru;
	nazevSouboru = nazevSouboru+pripona;
	ifstream vstup(nazevSouboru.c_str());

	if(!vstup.is_open())
	{
		cout<<"Chyba pri otevreni souboru."<<endl;
		poleFilmu=NULL;
		return poleFilmu;
	}

	if(poleFilmu!=NULL)
	{
		free(poleFilmu);
		poleFilmu=NULL;
		velikostPole=0;
		filtr="";
	}

	while(!vstup.eof())
	{
		getline(vstup,kopieRretezec,';');
		if(kopieRretezec.length()==0)
			break;

		if(velikostPole==0)
		{
			poleFilmu=(Film*)malloc(sizeof(Film)*(++velikostPole));
		}
		else
		{
			poleFilmu=(Film*)realloc(poleFilmu,sizeof(Film)*(++velikostPole));
		}
		strcpy(poleFilmu[cisloZaznamu].nazev_,kopieRretezec.c_str());
		getline(vstup,kopieRretezec,';');
		strcpy(poleFilmu[cisloZaznamu].zanr_,kopieRretezec.c_str());
		getline(vstup,kopieRretezec,';');
		strcpy(poleFilmu[cisloZaznamu].puvod_,kopieRretezec.c_str());
		getline(vstup,kopieRretezec,';');
		strcpy(poleFilmu[cisloZaznamu].zanr_,kopieRretezec.c_str());
		getline(vstup,kopieRretezec,';');
		poleFilmu[cisloZaznamu].id_=stoi(kopieRretezec);
		getline(vstup,kopieRretezec,'\n');
		poleFilmu[cisloZaznamu].trvani_=stoi(kopieRretezec);
		getline(vstup,kopieRretezec,'\n');
		poleFilmu[cisloZaznamu].rok_=stoi(kopieRretezec);
		kopieRretezec="";
		cisloZaznamu++;
	}

	if(velikostPole==0)
	{
		cout<<"Soubor je prazdny."<<endl;
		vstup.close();
		return poleFilmu;
	}
	cout<<"Nacteni ze souboru probehlo uspesne."<<endl;
	vstup.close();
	return poleFilmu;
}

void tisk(Film *poleFilmu,int velikostPole)
{
	system("cls");
	if(poleFilmu==NULL)
	{
		cout<<"Seznam je prazdny."<<endl;
	}
	else
	{
		cout<<"  "<<setw(11)<<left<<"Prijmeni"<<setw(10)<<"Jmeno"<<setw(23)<<"Nazev knihy"<<setw(10)<<"Zanr"<<setw(12)<<"Rok vydani"<<setw(5)<<"Pocet stran"<<endl<<endl;
		for(int i=0;i<velikostPole;i++)
		cout<<setw(3)<<i+1<<setw(10)<<left<<poleFilmu[i].id_<<setw(10)<<poleFilmu[i].nazev_<<setw(23)<<poleFilmu[i].rok_<<setw(13)<<poleFilmu[i].zanr_<<setw(13)<<poleFilmu[i].puvod_<<setw(5)<<poleFilmu[i].trvani_<<endl;
	}
}
Nahlásit jako SPAM
IP: 217.197.149.–
KIIV
~ Moderátor
+43
God of flame
12. 12. 2014   #15
-
0
-

michas kontejnerovy std::string s C-style retezcema char*..  do std::string muzes ten Ckovej rovnou priradit - zvladne to

ikdyz tezko rict, jak se ty stringy zachovaji, kdyz film a podobne vytvaris mallocem a ne pomoci new - neprovede se implicitni konstruktor a bude to asi docela vesely (a ani destruktor pokud bys to nekde mazal pomoci free a ne pomoci delete)

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
ondrej39+1
Věrný člen
12. 12. 2014   #16
-
0
-

#14 Ondra
Ta funkce je tak škaredá, že se na to nedá dívat. Hlavně je podle mě zbytečné se trápit s C sytaxí jako malloc, když to jde krásně jednodušše syntaxí C++ přes new. A to je jen jeden z příkladů. Večer ti ji přepíšu tak, aby fungovala a rovnou ti asi udělám i funkci pro exportování nazpátek do .csv souboru.

Nahlásit jako SPAM
IP: 46.39.172.–
Inject all the dependencies!
ondrej39+1
Věrný člen
13. 12. 2014   #17
-
0
-

Tady máš program kterej ti načte herce a následně filmy, do nichž přiřadí herce podle ID z těch csv souborů...

Struktura .csv souborů je třeba následující:

herci.csv

1;Leonardo;DiCaprio;11.11.1974;USA
2;Tom;Cruise;3.7.1962;USA
3;Emma;Watson;15.4.1990;GB
4;Emma;Stone;6.11.1988;USA
5;Ondrej;Vetchy;16.5.1962;CR
6;Christian;Bale;30.1.1974;USA
7;Johnny;Depp;9.6.1963;USA
8;Matthew;McConaughey;4.11.1969;USA
9;Matt;Damon;8.10.1970;USA
10;Denzel;Washington;28.12.1954;USA

======================================

filmy.csv

1;Harry Potter;2000;fantasy;USA;103;2 4 6 9
2;Interstellar;2014;sci-fi, thriller;USA;148;6 8 4
3;Jedna ruka tleska;2000;komedie;CR;95;5 10
4;Nejaka blbost;1997;drama, krimi;GB;236;1 3 7 5

V souboru filmy.csv jsou jednotlivá ID herců oddělená mezerami...

A takhle vypadá prográmek, který ti korektně načte data do správných vektorů...

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <sstream>

#define SOUBOR_HERCI "herci.csv"
#define SOUBOR_FILMY "filmy.csv"

struct Herec {
	int id_;
	std::string jmeno_;
	std::string prijmeni_;
	std::string datum_narozeni_;
	std::string misto_narozeni_;
};

struct Film {
	int id_;
	std::string nazev_;
	int rok_;
	std::string zanr_;
	std::string puvod_;
	int trvani_;
	std::vector<Herec *>obsazeni_;

	void detail_filmu()
	{
		std::cout << id_ << ": " << nazev_ << " (" << zanr_ << ")" << std::endl;
		std::cout << std::endl;
		std::cout << "Natocen ........: " << rok_ << std::endl;
		std::cout << "Zeme puvodu ....: " << puvod_ << std::endl;
		std::cout << "Delka filmu ....: " << trvani_ << " minut" << std::endl;
		std::cout << std::endl;
		std::cout << "Ucinkuji: "; vypis_herce();
		std::cout << std::endl;
		std::cout << std::endl;
	}

	void vypis_herce()
	{
		for (unsigned int i = 0; i < obsazeni_.size(); i++)
			std::cout << obsazeni_[i]->jmeno_ << " " << obsazeni_[i]->prijmeni_ << ", ";
	}
};

struct Filmoteka {	
	std::vector<Film *>seznam_filmu_;

	void vypis_filmy()
	{
		for (unsigned int i = 0; i < seznam_filmu_.size(); i++)
			seznam_filmu_[i]->detail_filmu();
	}
};
// nacti_herce
// jako parametr funkce se bere adresa vstupního vektoru, protože ho chceš měnit
void nacti_herce();

// nacti_filmy
// jako parametr funkce se bere adresa vstupního vektoru, protože ho chceš měnit
void nacti_filmy();

// je_soubor_prazdny
// ověřuje, zda se ve stupním souboru něco nachází
bool je_soubor_prazdny(std::ifstream &);

// globální vektory, nemá smysl je vytvářet na scopu mainu, určitě je budete potřebovat při každém běhu programu
std::vector<Herec>seznam_vsech_hercu;
std::vector<Film>seznam_vsech_filmu;

int main()
{
	// funkce pro načtení herců a filmů z .csv souborů do (globálních) vektoru pro další manipulaci
	nacti_herce();	
	nacti_filmy();

	system("PAUSE");

	return 0;	
}

void nacti_herce()
{
	std::ifstream herci_file;
	herci_file.open(SOUBOR_HERCI);	

	if (herci_file.fail())
	{
		std::cerr << "Soubor " << SOUBOR_HERCI << " se nepodarilo otevrit.\nPravdepodobne neexistuje." << std::endl;
	}
	else if (je_soubor_prazdny(herci_file))
	{
		std::cout << "Soubor s herci je prazdny." << std::endl;
	}
	else
	{
		while (herci_file)
		{
			std::string line;
			
			while (std::getline(herci_file, line))
			{
				Herec temp; // dočasný herec, do něhož se vloží data ze souboru  

				std::stringstream ss(line);
				std::string hs;

				//1; Leonardo; DiCaprio; 11.11.1974; USA

				// načítám ID
				std::getline(ss, hs, ';');
				int id = std::stoi(hs); // převádím ID na číslo
				temp.id_ = id;

				// načítám jméno
				std::getline(ss, hs, ';');
				temp.jmeno_ = hs;

				// načítám příjmení				
				std::getline(ss, hs, ';');
				temp.prijmeni_ = hs;				

				// načítám datum narození				
				std::getline(ss, hs, ';');
				temp.datum_narozeni_ = hs;

				// načítám zemi narození
				std::getline(ss, hs, ';');
				temp.misto_narozeni_ = hs;

				seznam_vsech_hercu.push_back(temp);
			}
			
		}
	}
}

void nacti_filmy()
{
	std::ifstream filmy_file;
	filmy_file.open(SOUBOR_FILMY);

	if (filmy_file.fail())
	{
		std::cerr << "Soubor " << SOUBOR_FILMY << " se nepodarilo otevrit.\nPravdepodobne neexistuje." << std::endl;
	}
	else if (je_soubor_prazdny(filmy_file))
	{
		std::cout << "Soubor s filmy je prazdny." << std::endl;
	}
	else
	{
		while (filmy_file)
		{
			std::string line;

			while (std::getline(filmy_file, line))
			{
				Film temp; // dočasný herec, do něhož se vloží data ze souboru  

				std::stringstream ss(line);
				std::string hs;

				// struktura souboru filmů:
				// id filmu; název; rok natočení; žánr; země původu; délka; ID herců

				// načítám ID
				std::getline(ss, hs, ';');
				int id = std::stoi(hs); // převádím ID na číslo
				temp.id_ = id;

				// načítám název filmu
				std::getline(ss, hs, ';');
				temp.nazev_ = hs;

				// načítám rok natočení				
				std::getline(ss, hs, ';');
				int rok = std::stoi(hs); // převádím rok na číslo
				temp.rok_ = rok;

				// načítám žánr
				std::getline(ss, hs, ';');
				temp.zanr_ = hs;

				// načítám zemi původu
				std::getline(ss, hs, ';');
				temp.puvod_ = hs;

				// načítám délku filmu
				std::getline(ss, hs, ';');
				int delka = std::stoi(hs); // převádím délku na číslo
				temp.trvani_ = delka;

				while (ss) // tento cyklus je nezbytný ro načtení všech herců
				{
					ss >> hs;					
					
					for (int i = 0; i < seznam_vsech_hercu.size(); i++)
					{
						if (seznam_vsech_hercu[i].id_ == std::stoi(hs))
							temp.obsazeni_.push_back(&seznam_vsech_hercu[i]);
					}
				}

				seznam_vsech_filmu.push_back(temp);
			}

		}
	}
}

bool je_soubor_prazdny(std::ifstream & soubor)
{
	return soubor.peek() == std::ifstream::traits_type::eof();
}

Snad ti to k něčemu bude. Bohužel to není ideální, namísto globálních vektorů by bylo lepší použít globální sety, ale teď už jsem na opravy moc unavenej.

Nahlásit jako SPAM
IP: 46.39.172.–
Inject all the dependencies!
Ondra
~ Anonymní uživatel
244 příspěvků
13. 12. 2014   #18
-
0
-

#17 ondrej39
Tak to je mazec   to bych dohromady nedal ani kdybych u toho sedel mesic, fakt diky moc, asi se mám ještě hooodně co učit :D určitě to k něčemu bude, teď mi to jen hází nějakou chybu u funkce stoi() , že není deklarována v " this cope " přitom potřebné knihovny tam naimportované mám :/ a to až po tom, co jsem všechny std:: nahradil syntaxí "using namespace std", pře tím to byla chyba 'stoi' is not a member of 'std' ,  ale s tím si snad už nějak poradím :)

Nahlásit jako SPAM
IP: 217.197.149.–
ondrej39+1
Věrný člen
13. 12. 2014   #19
-
0
-

#18 Ondra
Já vyvíjím v MS VS 2013, asi máš starší verzi překladače. Alternativou je použít atoi, akorát před tím musíš převést stringy pomocí c_str().

Nahlásit jako SPAM
IP: 46.39.172.–
Inject all the dependencies!
Ondra
~ Anonymní uživatel
244 příspěvků
15. 12. 2014   #20
-
0
-

Já používám CodeBlocks, sem tam MS VS 2010, pač v tom programujeme ve škole, ale asi mi sedí víc ten CodeBlocks. Jo tu funkci atoi jsme si už našel a už to načítá a asi to už i funguje, teď zase řeším jak to vypsat :D o víkendu jsem neměl kvůli brigádě čas na to kuknout, tak to musím napravit teď tak to snad rozjedu. Ještě jednou fakt díky moc :)

Nahlásit jako SPAM
IP: 2001:718:1001:1c1:df6:9b:...–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 73 hostů

Podobná vlákna

Školní projekt v C — založil sputnikone

Školní projekt — založil Asimka

Školní projekt — založil Honza

Školní projekt (Databáze) — založil Patrik Štěrba

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý