Здравствуйте, я делаю простую программу, которая должна создать абстрактную ферму с абстрактными животными , но у меня возникла проблема с чтением вектора из файла. Я переводил большую часть проекта, и я удалил некоторые из них, я думаю, несущественные функции и конструкторы. Программа отлично работает, когда вы в первый раз загружаете вектор, но он терпит неудачу после 2-го, 3-го ... начала. Он не работает, когда вы пытаетесь загрузить ферму froma перед созданным файлом. Прошу прощения за мой английский.Ifstream не умеет читать вектор из файла
этот код должен быть в classes.cpp - я не знаю, как писать здесь
#include<iostream>
#include<string>
#include<vector>
#include<iterator>
#include<fstream>
#include<stdlib.h>
using namespace std;
// declaration of class zviera(animal)
class zviera;
// class farm
class farma{
private :
// meno(name)
std::string meno;
// rozloha(size) - perhaps 945.5 * 749.9 meters
std::pair<double, double> rozloha;
// vector of friend class zviera(animal)
std::vector <zviera> zvery;
public :
// class zviera(animal) is friend class of farma
friend class zviera;
// constructor -----------------------------------------------------
farma() : meno(""), rozloha(0, 0), zvery(0) {}
// pridajZviera(addAnimal) to the vector
void pridajZviera(zviera & z){ zvery.push_back(z); }
friend std::ostream & operator<<(std::ostream & os, const farma & far);
friend std::istream & operator>>(std::istream & is, farma & far);
};
// the class zviera(animal)
class zviera{
private:
// druh(kind of animal)
std::string druh;
// pocet(number of the animals)
int pocet;
// sex of the animals
int pohlavie;
public:
// samec(male), samica(female) the sex of the animal
enum { samec = 0, samica = 1};
// constructor
zviera() :druh(""), pocet(0), pohlavie(0){}
friend std::ostream & operator<<(std::ostream & os, const zviera & zver);
friend std::istream & operator>>(std::istream & is, zviera & zver);
};
// classes.h
#include"classes.cpp"
// Writing values of an animal
std::ostream & operator<<(std::ostream & os, const zviera & zver){
os << "Kind of animal : " << zver.druh;
os << "\nNumber of animals : " << zver.pocet;
os << "\nSex of animal : " << (zver.pohlavie == zver.samec? "male" : "female");
return os;
}
// Setting values of an animal
std::istream & operator>>(std::istream & is, zviera & zver){
std::cout << "Kind : ";
is >> zver.druh;
std::cout << "Number : ";
is >> zver.pocet;
std::cout << "sex(0 - male, 1 - female) : ";
is >> zver.pohlavie;
return is;
}
// Writing saved values of a farm
std::ostream & operator<<(std::ostream & os, const farma & far){
os << "Name of the farm : " << far.meno;
os << "\nSize of the farm : " << far.rozloha.first << " * " << far.rozloha.second << "metres." << std::endl;
os << "Animals on the farm : \n";
std::vector <zviera>::const_iterator it = far.zvery.begin();
for (; it != far.zvery.end(); it++){
os << *it << "\n";
}
return os;
}
// Setting values of a farm
std::istream & operator>>(std::istream & is, farma & far){
std::cout << "Meno farmy je : ";
is >> far.meno;
std::cout << "Rozloha farmy je(a * b metrov) : ";
is >> far.rozloha.first;
is >> far.rozloha.second;
std::cout << " metrov.";
return is;
}
main.cpp
#include"classes.h"
int main()
{
ofstream fout;
ifstream fin;
int temp = 0;
int tmp = 5;
int tomp = 0;
string nazov;
farma far;
zviera zvero;
while (cin){
cout << "Hello would you like to load your farm from a file?(yes - 1, no - 0, end - 2) ";
cin >> temp;
switch (temp){
case 0:
cout << "Write a name of a file to save your new farm : ";
cin >> nazov;
fout.open(nazov.c_str(), ios_base::out);
cin >> far;
fout.write((char*)&far, sizeof far);
cout << "Would you like to add any animals to your farm?(0 - no, 1 - yes) ";
cin >> tmp;
while (tmp == 1){
switch (tmp){
case 1:cin >> zvero;
far.pridajZviera(zvero);
Я Меам проблемы возможно, здесь:
fout.write((char*)&zvero, sizeof zvero);
cout << "Would you like to add any animals to your farm?(0 - no, 1 - yes) ";
cin >> tmp;
break;
default:
break;
}
}
fout.close();
cout << "Do you wanna see your farm?(0 - no, 1 - yes) ";
cin >> tomp;
if (tomp == 1){
cout << far;
}
break;
case 1:
cout << "Enter name of the file in which is your farm : ";
cin >> nazov;
fin.open(nazov.c_str(), ios_base::in);
Проблема может быть также здесь Я думаю
fin.read((char*)&far, sizeof far);
while (fin.read((char*)&zvero, sizeof zvero)){
far.pridajZviera(zvero);
}
cout << far;
fin.close();
break;
case 2: exit(EXIT_SUCCESS);
default: cout << "Wrong value. Enter 0,1 or 2.\n";
break;
}
}
return 0;
}
Вы определили 'iostream' вставки и извлечения операторов, но вы используете' write', который будет просто писать двоичные данные. – crashmstr
@ user3923130 Слишком много кода! ** Прочитайте ** о [«Минимальные, завершенные, проверенные примеры»] (http://stackoverflow.com/help/mcve). Программа, которую вы написали, может содержать бесконечные проблемы ... но каждый заданный вами вопрос должен сужаться до одной * одной проблемы, которая может быть продемонстрирована. В качестве простого примера: если ваша проблема связана с чтением файлов, то * не включайте приглашение, запрашивающее, хочет ли кто-нибудь прочитать файл или нет *. Просто доведите это до одной проблемы за раз, как просто и коротко, как вы можете это сделать ... вы можете (в идеале) решить свою проблему в этом процессе. – HostileFork