• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

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

  • Автор темы minsk_girl
  • Дата начала
Статус
Закрыто для дальнейших ответов.
M

minsk_girl

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

H Е L P!!!!!!!!
 
T

tansa

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

Код:
void vivod (CompContainer sp)
{
FILE *in;
in=fopen ("comput.bin","rb"); 
while (!feof (in))
{
fread (&sp, sizeof (class CompContainer),1,in);
}
fclose (in);
}

ты даешь сюда параметром контейнер. Который при входе в функцию копируется и изменяется его копия, которая уничтожается при выходе из функции.

Поэтому сделай или
Код:
void vivod (CompContainer *sp);

или
Код:
void vivod (CompContainer &sp);

Потому что в этих случаях будешь изменють объект снаружи. Подробнее думаю не нада.... Если надо, то обращайся :D
 
N

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
 
M

minsk_girl

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

minsk_girl

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!