Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с записью/чтением файла, В конце появляется мусор 
V
    Опции темы
Xenon
Дата 7.6.2006, 00:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



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


--------------------
user posted image  
PM MAIL   Вверх
Dray
Дата 7.6.2006, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Материалист
**


Профиль
Группа: Участник
Сообщений: 652
Регистрация: 7.10.2003
Где: г. Всеволожск

Репутация: 2
Всего: 6



После строки 119:
Код
if (inf.eof())break;
 


--------------------
忍者

user posted image
PM MAIL   Вверх
Xenon
Дата 7.6.2006, 01:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



А, точно ... Или после 121 поставить n--? 


--------------------
user posted image  
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0410 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.