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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> fwrite и fread для массива структур, сохраняем и восстанавливаем в файл 
V
    Опции темы
delias
Дата 31.10.2009, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Прошу помощи - несколько дней бьюсь над поставленной задачей но безуспешно.
Есть массив структур:
Код

Book** s = new Book* [5];

    for (int i=0;i<5;i++)
    {
        s[i]=new Book;
    }
    strcpy_s(s[0]->title, "Zolotoy telenok");
    strcpy_s(s[0]->author, "Il`f i petrov");
    s[0]->pages=123;
    s[0]->price=1000;

и так далее


его нужно сохранить в файл с помощью fwrite
сохраняю:
Код

fwrite (s, sizeof(Book), 1, ff);

в файл сохраняются непонятные записи.

далее пытаюсь из файла структуры загрузить в массив обратно:
Код

fread(&s,    sizeof (Book), 1,    ff);


но ничего хорошего в структуру не загружается из файла, непонятный набор цифр но не то что я сохранял в файл..

парни, что делаю не правильно?
заранее благодарен
PM MAIL   Вверх
andrew_121
Дата 31.10.2009, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



delias, Что такое "Book" ?
Для чего такие извращения: Book** s = new Book* [5]; ?


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
delias
Дата 31.10.2009, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



ах да, главное не указал, Book это структура:
Код

struct Book{
    char title[30];
    char author[30];
    short pages;
    double price;
};



Цитата(andrew_121 @  31.10.2009,  19:41 Найти цитируемый пост)
Для чего такие извращения: Book** s = new Book* [5]; ?

так научили. возможно есть и более простые инструменты но не хочу отрываться от программы курса
PM MAIL   Вверх
andrew_121
Дата 31.10.2009, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



Цитата(delias @  31.10.2009,  20:08 Найти цитируемый пост)
так научили. возможно есть и более простые инструменты но не хочу отрываться от программы курса 

Минутку... Тебе нужно пять объектов типа "Book" ?
Код

Book s[5];



--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
delias
Дата 31.10.2009, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



да дело в том что это список книг. поэтому я в программе могу как добавлять так и удалять книги. следовательно количество объектов равное пяти я взял для примера
PM MAIL   Вверх
Anikmar
Дата 31.10.2009, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Цитата(andrew_121 @  31.10.2009,  20:25 Найти цитируемый пост)
Минутку... Тебе нужно пять объектов типа "Book" ?

Там динамический массив.


delias, 
Покажите полный код открытия файцла и записи в него. Что-то терзают меня смутные сомнения на счет имен переменных...
PM MAIL ICQ   Вверх
andrew_121
Дата 31.10.2009, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



Цитата(delias @ 31.10.2009,  20:36)
да дело в том что это список книг. поэтому я в программе могу как добавлять так и удалять книги. следовательно количество объектов равное пяти я взял для примера

А контейнеры нельзя использовать?
Код

std::vector<Book> books;


Если нет, то проще так:
Код

Book* books = new Book[5];

и доступ к элементам:
Код

Book any = books[2];


Добавлено через 43 секунды
Цитата(Anikmar @  31.10.2009,  20:44 Найти цитируемый пост)
Там динамический массив.

Просветил ;)


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Anikmar
Дата 31.10.2009, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Цитата(andrew_121 @  31.10.2009,  20:45 Найти цитируемый пост)
Просветил ;) 

Пошутил  smile 
PM MAIL ICQ   Вверх
delias
Дата 31.10.2009, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



не, контейнеры нельзя

Цитата(Anikmar @  31.10.2009,  20:44 Найти цитируемый пост)
Покажите полный код открытия файцла и записи в него. Что-то терзают меня смутные сомнения на счет имен переменных...

Код

#include<iostream>
#include<windows.h>
#include<conio.h>
using namespace std;
struct Book{
    char title[30];
    char author[30];
    short pages;
    double price;
};
// Создание нового списка строк
Book** CreateList(Book **s, int &n);
// Вывод списка строк на экран
void PrintList(Book **s, const int n);
// Удаление списка
Book** DeleteList(Book **s, int &n);
// Ввод информации о книге
void InputBookInfo(Book *s);
// Вывод информации о книге
void PrintBookInfo(Book *s);
void SearchBook(Book **s, int n);
Book** AddBook(Book **s, int &n);
Book** DelBook(Book **s, int &n);
Book** SortBook(Book **s, int &n);
void Save2File(Book **s, int &n);
void LoadFile(Book **s, int &n);
//main
void main()
{
    Book** s = new Book* [5];

    for (int i=0;i<5;i++)
    {
        s[i]=new Book;
    }
    strcpy_s(s[0]->title, "Zolotoy telenok");
    strcpy_s(s[0]->author, "Il`f i petrov");
    s[0]->pages=123;
    s[0]->price=1000;

    strcpy_s(s[1]->title, "Konek gorbunok");
    strcpy_s(s[1]->author, "Ershov");
    s[1]->pages=12;
    s[1]->price=4;

    strcpy_s(s[2]->title, "Geroy nashego vremeni");
    strcpy_s(s[2]->author, "Lermontov");
    s[2]->pages=125;
    s[2]->price=45;

    strcpy_s(s[3]->title, "Perviy vtoroy");
    strcpy_s(s[3]->author, "animatsia");
    s[3]->pages=123;
    s[3]->price=45;

    strcpy_s(s[4]->title, "Pulp Fiction");
    strcpy_s(s[4]->author, "Tarantino");
    s[4]->pages=45;
    s[4]->price=145;

    
    int n = 5, choice;
    while(1)
    {    
        system("cls");
        
        cout << "\tMenu\n1 - Create new booklist\n2 - Add new book\n3 - Delete book\n4 - Sort books by title\n5 - Search book\n6 - Print books\n7 - exit\n8 - Save to file\n9-load file\n";
        cin >> choice;
        switch(choice)
        {
            case 1: s = CreateList(s, n);
                break;
            case 2: s = AddBook(s,n);
                break;
            case 3: s = DelBook(s,n);
                break;
            case 4: s = SortBook(s,n);
                break;
            case 5: SearchBook(s,n);
                break;
            case 6:PrintList(s,n);
                break;
            case 7:
                s = DeleteList(s,n);
                exit(1); 
            case 8:
            Save2File(s,n);
            exit(1); 
            break; 
            case 9:
            LoadFile(s,n);
            exit(1); 
            break; 
            
        }
    }
}

void SearchBook(Book **s, int n)
{
    char s1[20];
    cout<<"Input a sentence: ";
    cin.getline(s1,sizeof(string));
    
    /*cout<<"search by title, input title:\n";
    cin.getline(s1,sizeof(string));*/
    for (int i=0;i<n;i++)
    {
        if (s1==s[i]->title)
        {
            cout<<"In line "<<i<<"\n";
            break;
        }
    }
}

Book** SortBook(Book **s, int &n)
{
    int j,i;
    char temp[80];
    Book** a=new Book*[n];
    for (int i=0;i<n;i++)
    {
        a[i]=s[i];
    }
    

    //sortirovka PUZYRKOM
    for (i=0;i<n-1;i++)
        {
            for (j=n-1;j>i;j--)
            {
                if ((*a[j]->title)<(*a[j-1]->title))
                {
                    strcpy_s(temp, a[j]->title);
                    //temp=a[j]->title;
                    strcpy_s(a[j]->title, a[j-1]->title);
                    //a[j]->title=a[j-1]->title;
                    strcpy_s(a[j-1]->title, temp);
                    //a[j-1]->title=temp;
                }
            }
        }


    return a;


}





// Удаление списка
Book** DeleteList(Book **s, int &n)
{
    if(s != NULL)
    {
        for(int i=0;i<n;i++)delete[] s[i];
        delete[] s;
        n = 0;
        return NULL;
    }
    return NULL;
}
// Создание нового списка строк
Book** CreateList(Book **s, int &n)
{
    s=new Book* [5];
    for (int i=0;i<5;i++)
    {
        s[i]=new Book;
    }

    
    
    /*DeleteList(s,n);

    cout << "Books count: ";
    cin >> n;
    
    s = new Book*[n];
    for(int i=0;i<n;i++)
    {
        s[i] = new Book;

        cout<<"\n-----------------------\n";
        cout<< "Book #" << i << ":\n";

        InputBookInfo(s[i]);
    }*/
    return s;
}
// Ввод информации о книге
void InputBookInfo(Book *s)
{
    cin.ignore();
    cout<< "Title: ";
    cin.getline(s->title,30);
    cout<< "Author: ";
    cin.getline(s->author,30);
    cout<< "Pages count: ";
    cin>>s->pages;
    cout<< "Price: ";
    cin>>s->price;
}
// Вывод информации о книге
void PrintBookInfo(Book *s)
{
    cout<< "Title: "<<s->title;
    cout<< "\nAuthor: "<<s->author;
    cout<< "\nPages count: "<<s->pages;
    cout<< "\nPrice: "<<s->price<<"\n";
}
// Вывод списка строк на экран
void PrintList(Book **s, const int n)
{
    for(int i =0; i<n; i++)
    {
        cout<<"\n-----------------------\n";
        cout<< "Book #" << i << ":\n";
        //PrintBookInfo(s[i]);    
        cout<< "Title: "<<s[i]->title;
    cout<< "\nAuthor: "<<s[i]->author;
    cout<< "\nPages count: "<<s[i]->pages;
    cout<< "\nPrice: "<<s[i]->price<<"\n";
    }
    cout << flush;
    _getch();
}

Book** AddBook(Book **s, int &n)
{
    Book** temp=new Book*[++n];
    for (int i=0;i<n-1;i++)
    {
        temp[i]=s[i];
    }
    temp[n-1]=new Book;
    InputBookInfo(temp[n-1]);
    if (s!=0) delete[]s;
    return temp;
}

Book** DelBook(Book **s, int &n)
{
    int nDel;
    
    cout << "Book count: ";
    cin >> nDel;
    Book** temp=new Book*[--n];
    for (int i=0, j=0;i<n;i++)
    {
        if (i!=nDel)
        {
        temp[j]=s[i];
        j++;
        }
        
    }
        if (s!=0) delete[]s;
        //cout<<temp[0];
        return temp;
}

void Save2File(Book **s, int &n)
{
    char fname [255]="save.txt";
    /*cout<<"File name\n";
    cin>>fname;*/
    FILE *ff=fopen (fname, "wb");
    if (ff==NULL)return;
    
    /*for (int i=0;i<n;i++)
    {
    fprintf(ff, "%s %s %d %f ", s[i]->title, s[i]->author, s[i]->pages, s[i]->price);
    }*/

    fwrite (s, sizeof(Book), 1, ff);
    cout<<5;
} 

void LoadFile(Book **s, int &n)
{
    char fname [255]="save.txt";
    FILE *ff=fopen (fname, "rb");
    //char temp[255];
    //Book** temp=new Book*[n];
    
    /*fgets ((char *)&s, sizeof(struct Book), ff);
    cout<<s[0]->author;*/
    /*char a[255],b[255];
    int c;
    float d;
    fscanf(ff, "%s %s %d %f", &a, &b, &c, &d);
    cout<<a;*/
    //int k;
    
    fread(&s,    sizeof (Book), 1,    ff);
    cout<<5;


    
    //Book** temp=new Book*[n_];
    
    /*fscanf (ff, "%s %s %d %f", s[0]->title, s[0]->author, s[0]->pages, s[0]->price);
    fscanf (ff, "%s %s %d %f", s[1]->title, s[1]->author, s[1]->pages, s[1]->price);*/
    

}



прошу прощения что комментарии не вычистил - думаю общий смысл работы кода будет ясен
PM MAIL   Вверх
andrew_121
Дата 31.10.2009, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



Цитата(delias @  31.10.2009,  20:51 Найти цитируемый пост)
прошу прощения что комментарии не вычистил

Ага, еще и 98 процентов кода smile 


п.с.
не могу я такой код читать...



--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
delias
Дата 31.10.2009, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



запись:
Код

void Save2File(Book **s, int &n)
{
    char fname [255]="save.txt";
   
    FILE *ff=fopen (fname, "wb");
   
    if (ff==NULL)return;
    
    fwrite (s, sizeof(Book), 1, ff);
   
} 


чтение:
Код

void LoadFile(Book **s, int &n)
{
    char fname [255]="save.txt";
    FILE *ff=fopen (fname, "rb");
        
    fread(&s, sizeof (Book), 1, ff);
    
}

PM MAIL   Вверх
delias
Дата 1.11.2009, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



вопрос решил, правильно так:
fwrite (s[0], sizeof(struct Book), 1, ff);
fread (s[0], sizeof(struct Book), 1, ff);

видимо первый раз до этого не получилось потому как больше одного блока задал
PM MAIL   Вверх
xvr
Дата 2.11.2009, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(delias @ 1.11.2009,  17:43)
вопрос решил, правильно так:
fwrite (s[0], sizeof(struct Book), 1, ff);
fread (s[0], sizeof(struct Book), 1, ff);

Запишет и прочтет по 1му экземпляру Book. Остальные 4 штуки останутся за бортом  smile 
PM MAIL   Вверх
delias
Дата 2.11.2009, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



та я в курсе. пущу по циклу ;)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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