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.