Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Проблема с записью/чтением файла


Автор: Xenon 7.6.2006, 00:45
Проблемка с записья или с чтением из файла ... При добавлении альбомов в ПО все в порядке, они отображаются нормально, но когда их сохраняешь в файл, а затем считываешь, они считываются, но в конце добавляется какой-то мусор. И я не понимаю, это мусор при записи или при чтении ... Так вроде все на взгляд правильно.
И еще вроде 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;    
}
 

Автор: Dray 7.6.2006, 00:58
После строки 119:
Код
if (inf.eof())break;
 

Автор: Xenon 7.6.2006, 01:03
А, точно ... Или после 121 поставить n--? 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)