/* имя следует изменить на 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 записей
иначе будет грохаться "просто так" при чтении из файла
Настоятельно рекомендую обратиться к тому товарищу, что начал писаль этот код
(непременно обещая конфеты с коньяком), с просьбой доделать работу.
ЗЫ. Коньяк отдельно. ![Big grin :D :D](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/1f600.png)