求助,从文件读出的一个结构体,想对他进行一些维护工作完后写回文件。
求助,从文件读出的一个结构体,想对他进行一些维护工作完后写回文件。
用什么比较好,STL的话
结构体里面有4五个字段,字符串和int
需要,根据一些字段实现删除操作。
[解决办法]
用结构体表达字段的集合,而用STL表达条目,例如:
typedef struct
{
int type;
char name[20];
char sex;
}person_t;
std::list<person_t> persons;
缺点是,没有充分利用二进制的特点,读写有点慢了。
2.2)每个数据确定存储长度,整体按照二进制,定长读写。
这种方式的优点是读写速度快。
3)
至于删除可以,分为直接删除和懒惰删除,懒惰删除只需要打上标记即可,无需移动数据。
删除的方法大概如下:
3.1) 一种办法是,读出数据,写到新文件里,删除旧文件,新文件改名为旧文件。
这个编程简单,容易实现。
3.2) 另一种是,在同一个文件里修改,需要移动数据,编程复杂,一般不采用这个办法。
但是懒惰删除,可以采用这个办法,因为几乎不需要移动数据;
优点是,不用另外建一个文件。
[解决办法]
展示一下用例:
#include <fstream>
#include <iostream>
#include <map>
#include <algorithm>
using namespace std;
class UserStruct
{
private:
int m_nAge;
string m_ID;
string m_Name;
//....
public:
UserStruct(string name, string id, int age):
m_Name(name), m_ID(id), m_nAge(age)
{
}
~UserStruct();
friend ifstream& operator>> (ifstream &in, UserStruct &us)
{
in>>us.m_ID>>us.m_nAge>>us.m_Name;
return in;
}
};
void TestUserStruct()
{
// update操作多的就用list,查询多的就用vector
list<UserStruct> userList;
// 再或者是用map为结构体中的某个字段建立对应关系
map<string, UserStruct> userMap;
// 根据名字建立映射
userMap.insert(make_pair("haha", UserStruct("haha", "123", 21)));
// 根据key值查找UserStruct
userMap.find("haha");
}