Ich habe eine Datei, die ich in einer Binärdatei mit Hilfe von Datensätzen lesen und schreiben möchte. Am Anfang habe ich eine leere Datei und möchte einen neuen Datensatz hinzufügen, aber wenn ich die seekp-Funktion verwende, dann ist die Position bei (-1) ist es ok? Denn wenn ich nachschaue, sehe ich, dass es nichts in die Datei geschrieben hat. Siehe Code:Arbeiten mit fstream-Dateien in Overflow-Verkettung in C++
void Library::addBook(Book newBook)
{
fstream dataFile;
dataFile.open("BookData.dat", ios::in | ios::out);
if (!dataFile)
{
cerr << "File could not be opened" << endl;
}
int hashResult = newBook.getId() % 4 + 1; // The result of the hash function
// Find the right place to place the new book
dataFile.seekg((hashResult - 1) * sizeof(Book), ios::beg);
Book readBook;
dataFile.read(reinterpret_cast<char*>(&readBook), sizeof(Book));
// The record doesnt exist or it has been deleted
if (readBook.getId() == -1)
{
// The record doesnt exist
if (readBook.getIdPtr() == -1)
{
dataFile.seekp((hashResult - 1) * sizeof(Book));
dataFile.write(reinterpret_cast<char*>(&newBook), sizeof(Book));
}
// The record has been deleted or there is already such record with such hash function
// so we need to follow the pointer to the overflow file
else
{
newBook.setIsBookInData(false); // New book is in overflow file
overflowFile.seekg((readBook.getIdPtr() - 1) * sizeof(Book));
overflowFile.read(reinterpret_cast<char*>(&readBook), sizeof(Book));
// Follow the chain
while (readBook.getIdPtr() != -1)
{
overflowFile.seekg((readBook.getIdPtr() - 1) * sizeof(Book));
overflowFile.read(reinterpret_cast<char*>(&readBook), sizeof(Book));
}
readBook.setIdPtr(header); // Make the pointer to point to the new book
overflowFile.seekp((header - 1) * sizeof(Book));
overflowFile.write(reinterpret_cast<char*>(&newBook), sizeof(Book));
header++;
}
}
Wenn mir jemand sagen kann, warum ich nichts in die Datei schreiben kann, werde ich es wirklich schätzen.
Vielen Dank im Voraus,
Greg
:(Niemand weiß, wie es zu lösen ist? –
Wenn es keine Hausaufgaben ist, dann verwenden Sie keine vorhandenen Lösungen, z. B. Boost.Serialization, wenn Sie Serialisierung benötigen, 'Google Protocol Buffers' zum Austauschen binärer Daten zwischen Programmen (oder irgendeine Bibliothek für XML, JSON, wenn Textformate akzeptabel sind), 'sqlite' für eine leichte Datenbanklösung? – jfs