Я хочу, чтобы иметь возможность записывать связанный список типа Music в двоичный файл, а затем читать его обратно в связанный список. Конечно, у меня проблемы с этим. Насколько я понимаю, моя проблема в том, что строка является переменной длиной. Поскольку строка не всегда одинакового размера, при чтении ее не видно, сколько нужно читать. Я собирался преобразовать свой класс в фиксированные длины cstrings, чтобы исправить проблему. Фактически, я пытался, но имел несколько других проблем, которые были вызваны этим. Мой вопрос: есть ли способ сделать то, что я хочу, без кардинального изменения моего кода?Чтение двоичного файла в объект класса
void ReadBinFile(Node * head, string filename)
{
Music new_song;
ifstream bin(filename, ios::in | ios::binary);
if (bin.is_open())
{
while (!bin.eof())
{
bin.read(reinterpret_cast<char *>(&new_song), sizeof(Music));
if (!bin.eof())
{
Node * new_node = CreateNode(new_song);
AppendNode(head, new_node);
}
}
bin.close();
}
}
void Save(Node * head, string filename)
{
ofstream bin(filename, ios::out | ios::binary);
if (bin.is_open())
{
Node * traveler = head;
while (traveler != nullptr)
{
bin.write(reinterpret_cast<char *>(&(traveler->song)), sizeof(Music));
traveler = traveler->next;
}
bin.close();
}
}
Node * CreateNode(Music song)
{
Node * new_node = new Node;
new_node->song = song;
new_node->next = nullptr;
return new_node;
}
//music.h
class Music
{
public:
Music(string name = "", string artist = "");
private:
string m_name;
string m_artist;
};
Хотите добавить информацию о том, как выглядит формат вашего двоичного файла? –
@CyberSpock Я бы, но я точно не знаю, что это за формат. Я не знаю много о бинарных файлах. Я мог бы скопировать + вставить пример одного сгенерированного, если это поможет. –
вам нужно сначала определить формат, а затем создать функции pack/unpack для чтения/записи одной записи. –