Я решил прочитать/записать в файл с использованием сериализации; однако он только прав несколько элементов. Наши элементы динамически распределяются через тестовые скрипты, после того как все они помещены в вектор, они затем будут записаны в скрипт. Ниже приведен код в нашей основной функции - случаи коммутатора, где мы вызываем функции для чтения и записи объектов, и, наконец, функции, в которых мы пытаемся записать и прочитать файл. Я не знаю, почему это только чтение в пара-объекте, поэтому любая помощь будет отличной!C++: запись и чтение объектов в двоичный файл
////////////////////////////////////////////////////////
// Main
int main(int argc, char *argv[]) {
std::string optionInput;
const char *const file_name = "data.dat";
menuDisplay();
while (loopBool) {
std::cin.clear();
if (selectedObject == SELECT_INIT) {
std::cout << std::endl << "Menu (No Item): ";
} else {
std::cout << std::endl << "Item " << selectedObject << " Menu: ";
}
try {
optionInput = menuInput();
} catch (const Input_Error &) {
std::cout << "Input error detected. Exiting.\n";
break;
}
catch (...) {
std::cout << "You should not be seeing this error message.\n";
break;
}
std::cout << optionInput[0] << std::endl;
optionSelect(optionInput[0]);
}
std::cout << "Exiting\n" << std::endl;
}
////////////////////////////////////////////////////////
// Case 'W'
case 'W': {
// Writes authors to a file
std::ofstream aSaveFile("authors.dat");
boost::archive::text_oarchive aArchiveOut(aSaveFile);
aArchiveOut << authorObject;
// Writes mediaItem objects to a file
std::ofstream mSaveFile("items.dat");
boost::archive::text_oarchive mArchiveOut(mSaveFile);
ioMediaInfo itemSender;
for (int mediaWrite = 0; mediaWrite < mediaObject.size(); mediaWrite++) {
itemSender.assignVariables(mediaObject[mediaWrite]);
mArchiveOut << itemSender;
}
break;
}
////////////////////////////////////////////////////////
// Case 'Z'
case 'Z': {
// Reads in authors to author array
std::ifstream aReadFile("authors.dat");
boost::archive::text_iarchive aArchiveIn(aReadFile);
aArchiveIn >> authorObject;
// Reads in mediaItems
std::ifstream mReadFile("items.dat");
boost::archive::text_iarchive mArchiveIn(mReadFile);
std::string itemType;
ioMediaInfo itemReciever;
// for (int mediaRead = 0; mediaRead < 20; mediaRead++)
// {
mArchiveIn >> itemReciever;
// Checks type of current object and creates a new mediaItem object in the vector to store it
// TODO: Break case statement repetition into functions for greater code reuse
itemType = itemReciever.getType();
switch (itemType[0]) {
case '*': {
mediaObject.push_back(new mediaInfo());
selectedObject++;
mediaObject[selectedObject]->setName(itemReciever.getName());
mediaObject[selectedObject]->setYear(itemReciever.getYear());
mediaObject[selectedObject]->setEmpty(itemReciever.getEmpty());
break;
}
case 'B': {
mediaObject.push_back(new bookInfo());
mediaObject[selectedObject]->setName(itemReciever.getName());
mediaObject[selectedObject]->setEmpty(itemReciever.getEmpty());
break;
}
case 'V': {
mediaObject.push_back(new videoInfo());
mediaObject[selectedObject]->setName(itemReciever.getName());
mediaObject[selectedObject]->setEmpty(itemReciever.getEmpty());
break;
}
case 'M': {
mediaObject.push_back(new musicInfo());
mediaObject[selectedObject]->setName(itemReciever.getName());
mediaObject[selectedObject]->setEmpty(itemReciever.getEmpty());
break;
}
default: { break; }
}
// }
break;
}
////////////////////////////////////////////////////////
// assignVariable where we write to file
void ioMediaInfo::assignVariables(mediaInfo *originalMediaObject) {
mediaItemName_ = originalMediaObject->getName();
mediaItemYear_ = originalMediaObject->getYear();
mediaItemPageNum_ = originalMediaObject->getPage();
mediaItemPrint_ = originalMediaObject->getPrint();
mediaItemValue_ = originalMediaObject->getValue();
mediaItemType_ = originalMediaObject->getType();
isEmpty_ = originalMediaObject->isEmpty();
// mediaItemAuthor_ = originalMediaObject->getAuthor();
}
////////////////////////////////////////////////////////
// Where we read the file
void ioMediaInfo::printData() { std::cout << mediaItemName_ << std::endl; }
You как представляется, отсутствует часть вашего кода. Есть два оператора case, которые находятся вне функции. Это намеренно? – phantom
@Phantom Я просто предоставил код, который, как я чувствовал, был уместным для чтения и записи в файлы. У меня есть целая инструкция switch, которая отличается от этих случаев. Если вы хотите увидеть больше кода, я могу его предоставить. –
Обязательно добавьте еще код. В классе нет сериализуемого класса. – sehe