作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 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;
}
有什么想法吗?
最佳答案
您的代码中存在多个问题:
std::map<>
不是微不足道的,无法按照您尝试的方式序列化去做吧。您必须自己逐项序列化它。dbfile.clear();
只清除流的错误标志可能不是您想要做的。我不敢冒险说这个列表已经接近完整。希望这个例子能给您一些提示:
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/
我是一名优秀的程序员,十分优秀!