gpt4 book ai didi

c++ - 在 C++ 中的溢出链接中处理 fstream 文件

转载 作者:行者123 更新时间:2023-11-30 03:12:26 25 4
gpt4 key购买 nike

我有一个文件,我想使用记录读取和写入二进制文件。一开始我有一个空文件,我想添加新记录,但是当我使用 seekp 函数时,位置在 (-1) 可以吗?因为当我检查时,我发现它没有向文件写入任何内容。见代码:

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++;
}
}

如果有人能告诉我为什么我不能向文件写入任何内容,我会非常感激。

提前致谢

格雷格

最佳答案

下面是一些可能有用的建议:

  • 打开文件时,使用 ios_base::binary 标志
  • 确保 Book 是 POD(即 C 兼容类型)
  • 确保在读取或写入流之前和之后都处于有效状态
  • 不要使用 readBook.getId() == -1 来检查读取是否成功
  • 确保当您搜索流时不会越过文件末尾
  • 使用缓冲区获取文件中的总字节数,然后确保在查找之前不超过它
  • 无论何时寻找,都进行相对寻找(例如使用 ios_base::beg)
  • 使用static_cast<char*>(static_cast<void*>(&book))对比reinterpret cast<char*>

如果您对这些建议有任何具体问题,请告诉我们,也许我们可以更好地指导您。

关于c++ - 在 C++ 中的溢出链接中处理 fstream 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/993076/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com