Проблемка с записья или с чтением из файла ... При добавлении альбомов в ПО все в порядке, они отображаются нормально, но когда их сохраняешь в файл, а затем считываешь, они считываются, но в конце добавляется какой-то мусор. И я не понимаю, это мусор при записи или при чтении ... Так вроде все на взгляд правильно. И еще вроде cd_num - счетчиков компактов как-то не так работает ... | Код | #include <iostream> #include <string> #include <conio.h> #include <fstream>
using namespace std; const int MAX=30; /////////////////////////////////////////////////////// class album { private: int year; string name; string artist; string genre; static int cd_num; static album* albums[]; static int n; public: static bool is_changed; album() { ifstream infile; infile.open("collection.dat",ios::binary); if(infile)//Если фаил существует, то ... { infile.seekg(0,ios::end); cd_num=(int)infile.tellg()/sizeof(album); //... Узнаем количество компактов в файле infile.close(); } else { cd_num=0; } } void enter_data(); void get_data(); static void write(); static void add(); static void display_all(); static void read(); }; int album::n; album* album::albums[MAX]; bool album::is_changed=false; int album::cd_num; /////////////////////////////////////////////////////// ///Отображение всех альбомов void album::display_all() { for (int j=0;j<n;j++) { albums[j]->get_data(); } } /////////////////////////////////////////////////////// ///Добавление альбома void album::add() { is_changed=true; albums[n]=new album; albums[n++]->enter_data(); cd_num++; } /////////////////////////////////////////////////////// ///Ввод данных о компакте с клавиатуры void album::enter_data() { cout << "Enter Artist: "; cin >> artist; cout << "Enter Album: "; cin >> name; cout << "Enter Album`s year "; cin >> year; cout << "Enter Genre: "; cin >> genre; } /////////////////////////////////////////////////////// ///Вывод данных об альбоме void album::get_data() { cout << artist << " - " << name << endl; cout << "Genre: " << genre << endl; cout << "Year: " << year << endl; cout << "Cd num: " << cd_num << endl; } /////////////////////////////////////////////////////// ///Запись в файл данных из ПО void album::write() { ofstream outfile; outfile.open("collection.dat",ios::binary | ios::app); if (!outfile) { cout << "Couldn`t open file"; } for (int j=0;j<n;j++) { outfile.write((char*)(albums[j]),sizeof(album)); } is_changed=false; } /////////////////////////////////////////////////////// ///Чтение данных из файла void album::read() { ifstream inf; inf.open("collection.dat",ios::binary); if (!inf) { cout << "Couldn`t open file"; } else { n=0; while (!inf.eof()) { albums[n]=new album; inf.read((char*)(albums[n]),sizeof(album)); n++; } } } /////////////////////////////////////////////////////// int main() { do { int choice; cout << "\nWhat to Do? \n1)...; \n2)Display album; \n3)Add album; \n4)Read from file \n5)Save to file \n6)Exit: "; cin >> choice; switch (choice) { case 1:album::display_all(); break; case 2: ....; break; case 3:album::add(); break; case 4:album::read(); break; case 5:album::write(); break; case 6:return false; break; default:cout << "Incorrect choice. Try again"; break; } }while(true); if (album::is_changed==true) { do { char choice; cout << "Yo have made changes to file. Do you want to save them? y/n"; cin >> choice; if (choice=='y' || choice=='Y') { album::write(); return false; } if (choice=='n' || choice=='N') { return false; } }while(true); } _getch(); return 0; }
|
|