首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

,从文件读出的一个结构体,想对他进行一些维护工作完后写回文件

2013-07-16 
求助,从文件读出的一个结构体,想对他进行一些维护工作完后写回文件。求助,从文件读出的一个结构体,想对他进

求助,从文件读出的一个结构体,想对他进行一些维护工作完后写回文件。
求助,从文件读出的一个结构体,想对他进行一些维护工作完后写回文件。
用什么比较好,STL的话
结构体里面有4五个字段,字符串和int
需要,根据一些字段实现删除操作。
[解决办法]
用结构体表达字段的集合,而用STL表达条目,例如:


typedef struct
{
    int type;
    char name[20];
    char sex;
}person_t;

std::list<person_t> persons;

[解决办法]
fread 和fwrite,offset 这些不能实现么?
[解决办法]
推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

不要把
fopen("...","...");fscanf,fprintf,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待

fopen("...","...b");fread,fwrite,fclose  //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待
弄混了

[解决办法]
我喜欢序列化后写入
[解决办法]
这样的需求为什么不用数据库?比如轻量级的SQLite就很合适的。

引用:
Quote: 引用:

用结构体表达字段的集合,而用STL表达条目,例如:

typedef struct
{
    int type;
    char name[20];
    char sex;
}person_t;

std::list<person_t> persons;

list能不能实现根据字段查找,和删除哇。求个学习的代码

[解决办法]
可以用两种方法,存储,删除数据,需要零件一个文件,或者移动文件的数据
下面分三个情况说明,1)文本文件方式存储,2)二进制方式存储,3)删除数据的方法。
             
1)文本文件方式存储:
 数据按文本格式存储,全部转换成字符串,存储为文本文件;
 每个结构一行,中间用 空格,逗号,分号等 字符串里不会出现的,分隔符分开。
 说白了,就是按照一定格式存储为字符串;
 读出时,按格式读出。

 这里可能会存在某些读写陷阱。
 格式需要仔细设计。
 优点是数据是文本格式的,查看方便,直接用文本编辑器,就可以查看了。
 修改数据也容易。

2)二进制方式存储
    数据按照二进制存储,定长读写。
   2.1)每个数据确定存储长度,包括字符串,都按照定长存储。
       读取时一个数据一个数据读出。
       这种方式,可以保证在,任何平台上数据严格一致,即解决了,数据持久化的问题。


       缺点是,没有充分利用二进制的特点,读写有点慢了。

   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");
}

不知道对你有没有帮助

热点排行