gpt4 book ai didi

c++ - 当我尝试使用读取和写入时,为什么 fstream 无法正常工作?

转载 作者:行者123 更新时间:2023-12-02 02:19:05 24 4
gpt4 key购买 nike

我正在尝试使用 fstream 和 map 创建本地文件数据库。我正在使用 fstream 类进行读写。但它正在创建一个空文件,我尝试使用运算符 >>、<< 和函数 read()、write()。而且它也不起作用。

这里是代码:

#include <iostream>
#include <map>
#include <fstream>
#include <string>
using str = std::string;
class MapDB{
public:
MapDB(str path){
this->dbfile.open(path, std::fstream::in | std::fstream::out | std::fstream::trunc);
}
void PushValue(str key, str value){
this->Load();
this->db[key] = value;
this->Save();
}
str GetValue(str key){
this->Load();
return this->db[key];
}
void RemoveKey(str key){
this->db.erase(key);
this->Save();
}
~MapDB(){
this->dbfile.close();
}
private:
void Load(){
//this->dbfile.read((char*)&this->db, sizeof(MapDB));
this->dbfile >> (char*)&this->db;
}
void Save(){
this->dbfile.clear();
//this->dbfile.write((char*)&this->db, sizeof(MapDB));
this->dbfile << (char*)&this->db;
}
std::fstream dbfile;
std::map<str, str> db;
};
int main(int argc, char *argv[]){
std::map<str, str> mydb;
MapDB mydata("/path/to/file/data.data");
mydata.PushValue("key", "value");
std::cout << mydata.GetValue("key") << std::endl;
}

有什么想法吗?

最佳答案

您的代码中存在多个问题:

  1. std::map<>不是微不足道的,无法按照您尝试的方式序列化去做吧。您必须自己逐项序列化它。
  2. dbfile.clear();只清除流的错误标志可能不是您想要做的。
  3. Load() 应该定位读取光标,Save() 应该定位读取光标写入光标。
  4. 您的构造函数会截断文件。所以没有机会读书由 MapDB 的另一个实例编写的内容。 (也许这是故意的)

我不敢冒险说这个列表已经接近完整。希望这个例子能给您一些提示:

class MyDB
{
public:
// constructor.
// creates or opens the file in binary mode (because we store binary data like the number of items and, the length of the strings).
// truncates the file on open if the flag 'truncateOnOpen' is set.
MyDB(const std::string& filename, bool truncateOnOpen)
: dbfile(filename, std::fstream::binary | std::fstream::in | std::fstream::out | (truncateOnOpen ? std::fstream::trunc : 0))
{}

void Load()
{
// drop old database content
db.clear();

// position read cursor to the beginning of the file
dbfile.seekg(0);

// read the number of entries
size_t entries = 0;
dbfile.read(reinterpret_cast<char*>(&entries), sizeof(entries));

// read key and value for each entry
std::string key, value;
for (size_t i = 0; i < entries; ++i)
{
readString(&key);
readString(&value);
db[key] = value;
}
}

void Save()
{
// position the write cursor to the beginning of the file
dbfile.seekp(0);

// write thenumber of entries
size_t entries = db.size();
dbfile.write(reinterpret_cast<const char*>(&entries), sizeof(entries));

// write key and value for each entry
for (auto& it : db)
{
writeString(it.first);
writeString(it.second);
}
}

private:
// reads a single string from the file
bool readString(std::string* target)
{
// read the length of the string stored in the file
size_t len;
if (dbfile.read(reinterpret_cast<char*>(&len), sizeof(len)).fail())
return false;

// preallocate memory for the string
target->resize(len);

// read the string from the file
return dbfile.read(&target->front(), target->size()).good();
}

// writes a single string to the file
void writeString(const std::string& source)
{
// write the length of the string to the file
size_t len = source.size();
dbfile.write(reinterpret_cast<char*>(&len), sizeof(len));

// write the string itself to the file
dbfile.write(source.data(), source.size());
}

private:
std::fstream dbfile;

public:
std::map<std::string, std::string> db;
};

关于c++ - 当我尝试使用读取和写入时,为什么 fstream 无法正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66698471/

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