Как записать и ситывать в бинарный файл класс-контейнер?

Тема в разделе "Общие вопросы по С и С++", создана пользователем minsk_girl, 4 май 2007.

Статус темы:
Закрыта.
  1. minsk_girl

    minsk_girl Гость

    Есть 3 файла программы. В .h файле описаны структура и класс-контейнер, описывающий массив таких структур. Выполняются всякие там тра-ля-ля функции. Необходимо в головном файле написать функции для записи данных контейнера в массив и считывания их, при этом все эти данные постоянно еняются. Это нужно для того, чтобы для теста программы не вводить по 100 раз базу данных. Помогите. Может есть какие-нибудь функции. Через fwrite записать в файл получается, а вот при fread выдается ошибка уже в консоле.

    H Е L P!!!!!!!!
     
  2. tansa

    tansa Гость

    проблемма в функции

    Код (Text):
    void vivod (CompContainer sp)
    {
    FILE *in;
    in=fopen ("comput.bin","rb");
    while (!feof (in))
    {
    fread (&sp, sizeof (class CompContainer),1,in);
    }
    fclose (in);
    }
    ты даешь сюда параметром контейнер. Который при входе в функцию копируется и изменяется его копия, которая уничтожается при выходе из функции.

    Поэтому сделай или
    Код (Text):
    void vivod (CompContainer *sp);
    или
    Код (Text):
    void vivod (CompContainer &sp);
    Потому что в этих случаях будешь изменють объект снаружи. Подробнее думаю не нада.... Если надо, то обращайся :D
     
  3. North

    North Гость

    /* имя следует изменить на write
    аргумент следует передавать по ссылке
    минимизируются операции копирования данных
    и исключаются вызовы конструкторов\деструкторов
    */
    void vvod (CompContainer sp)
    {
    FILE *out; // Неинициализиронанные переменные это ЗЛО
    out=fopen ("comput.bin","wb");
    // Необходимо делать проверку на UNLL
    for (int i=0; i<sp.count; i++)
    {
    fwrite (&sp, sizeof (class CompContainer),1,out);
    }
    fclose (out);
    }

    void vivod (CompContainer sp) // имя следует изменить на read
    {
    FILE *in; // Неинициализиронанные переменные это ЗЛО
    // Необходимо делать проверку, вдруг нету такого файла
    in=fopen ("comput.bin","rb");
    while (!feof (in))
    {
    fread (&sp, sizeof (class CompContainer),1,in);
    }
    fclose (in);
    }
    ОЧЕНЬ маргинально



    как работают функции fread/fwrite:

    1 аргумент адрес области памяти(указатель на), достаточного размера
    2 аргумент размер в байтах того что будет прочитано(fwrite)/записано(fread) в указанную первым аргументом область памяти
    3 количество повторений, фактичски множитель, операций, для одной записи надо "1"
    4 указатель на корректную (инициализированную) структуру FILE



    // Важно тонко понимать разницу при передаче по значению и по ссылке
    // Это НЕОБХОДИМО понять
    void write(const CompContainer& sp)
    {
    FILE *out=fopen ("comput.bin","wb"); // Если файл не существует он создастся
    if(!out) return; // Проверка на NULL
    for (int i=0; i<sp.count; i++)
    {
    // Делаем итерации по всем элементам контейнера
    // Внимание индексация!!!
    // первый аргумент это адрес того что буднт записано в файл
    // &sp - означает что ма обращаемся к i-му элементу(sp), а затем берем его адрес &sp

    // Мы читаем структуру Computer а не CompContainer, причем поштучно


    //ВНИМАНИЕ !! член класса CompContainer:: p является закрытым (по умолчанию private)!!!
    // Для работы следующего кода необходимо изменить доступ к нему на public
    // Вставь в файле "CompContainer.h" в класс CompContainer, перед упоминанием
    // "Computer* p; // массив записей", строку "public:".
    // Либо измени "class CompContainer" на "struct CompContainer"
    fwrite (&sp.p, sizeof (Computer),1,out);
    }
    fclose (out); // Корректно закрываем файл и освобождаем ресурсы
    }

    void vivod (CompContainer& sp)// const отсутствует тк будем её изменять
    {
    FILE *in=fopen ("comput.bin","rb");
    if(!in) return; // Проверка на NULL
    while (!feof (in))
    {
    /* Мы должны указать куда будут прочитаны данные из файла
    для этого определим временную переменную Computer temp
    */
    Computer temp;
    // Теперь туда читаем из файла
    fread (&temp, sizeof (Computer),1,in);
    // Теперь заполненную временную переменную добавляем в контейнер
    sp.insert(temp);

    }
    fclose (in);// Корректно закрываем файл и освобождаем ресурсы
    }

    Не рекомендую инициализировать контейнер значением меньшим чем на 200 записей
    иначе будет грохаться "просто так" при чтении из файла

    Настоятельно рекомендую обратиться к тому товарищу, что начал писаль этот код
    (непременно обещая конфеты с коньяком), с просьбой доделать работу.
    ЗЫ. Коньяк отдельно. :D
     
  4. minsk_girl

    minsk_girl Гость

    Для: North
    Спасибочки.Сейчас попробую сделать.
    И кстати всю задачу я сама писала, о каком коде ты говоришь????????????????
     
  5. minsk_girl

    minsk_girl Гость

    Для: North
    Спасибо!!!!!!!!!
    Ты гений!!!!!!!
    НО!!!!!!!!!!!
    Когда считываю с файла. Выводится на консоль дублированно строки.
    Т.е. каждая дважды.
    Я вроде все проверила, не понимаю, где она дублируется...
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей