如何读写 vector<> 结构的文件

hzy694358 2009-12-04 02:29:34
结构如下:
typedef struct info_Novel
{
string url;
string src;
string title;
}InfoNovel;
vector<InfoNovel> Info;
请问如何将Info,写入dat文件及从dat文件中读取出来??
...全文
416 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2009-12-04
  • 打赏
  • 举报
回复
不好意思,没有调试过,刚才看了一下确实是不对的。
把上面代码里面的 ReadFile/WriteFile 的第二个参数由原来的 &vDat 改写成 &vDat[0] 就可以了。我自己测试过是可以的。
hzy694358 2009-12-04
  • 打赏
  • 举报
回复
奇怪问题,当我写完马上读,能读出来,但是当我
重新打开程序读的时候,就会挂掉:MSVCP60D.DLL 越界
vector<InfoNovel>::iterator itr_Begin=vInfo.begin();
vector<InfoNovel>::iterator itr_End=vInfo.end();
vector<InfoNovel>::iterator itr_Iter;
size_t test=vInfo.size();
for (itr_Iter=itr_Begin;itr_Iter!=itr_End;++itr_Iter)
{
CString strUrl=itr_Iter->url.c_str();//挂在这
CString strTitle=itr_Iter->title.c_str();
CString strSrc=itr_Iter->src.c_str();
}
这个是怎么回事。
「已注销」 2009-12-04
  • 打赏
  • 举报
回复
要向文件写内容,你得告诉它占多少字节,然后写/读下一个内容的时候,同样要移动指针到正确的位置.
查个MSDN一分钟而已,比发贴的时间少多了. 这两个函数随手写的,功能都应该能实现,你可能要自己调试一下。
hzy694358 2009-12-04
  • 打赏
  • 举报
回复
// 12 是随便写的一个偏移,你可能要根据具体的要求具体写
bRet = WriteFile(hFile, &lLen, 12, &dwWrite, NULL);
这个偏移量12,是指什么
不好意思,这个函数没用过,自己查费时间
「已注销」 2009-12-04
  • 打赏
  • 举报
回复
楼主顺便把另一贴的分也给我吧.. 曾经见某贴的传说分还有概率换到书本


typedef struct _st_dat
{
int nx;
float fy;
char szBuf[12];
}ST_DAT;

void MyWrite(CString strFile, const vector<ST_DAT> &vDat)
{
HANDLE hFile = CreateFile(strFile, FILE_WRITE_DATA, FILE_SHARE_READ,
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (INVALID_HANDLE_VALUE == hFile)
{
return;
}
long lLen = vDat.size();
DWORD dwWrite = 0;
BOOL bRet = FALSE;
// 先定长度
// 12 是随便写的一个偏移,你可能要根据具体的要求具体写
bRet = WriteFile(hFile, &lLen, 12, &dwWrite, NULL);
// 移动文件指针
SetFilePointer(hFile, 12, NULL, FILE_BEGIN);
// 再写内容
bRet = WriteFile(hFile, &vDat, sizeof(vDat) * lLen, &dwWrite, NULL);
CloseHandle(hFile);
}
void MyRead(CString strFile, vector<ST_DAT> &vDat)
{
long lLen = 0;
HANDLE hFile = CreateFile(strFile, FILE_READ_DATA, FILE_SHARE_READ,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (INVALID_HANDLE_VALUE == hFile)
{
return;
}
BOOL bRet = 0;
DWORD dwRead = 0;
// 12 是随便写的一个偏移,你可能要根据具体的要求具体写
bRet = ReadFile(hFile, &lLen, 12, &dwRead, NULL);
vDat.resize(lLen);
SetFilePointer(hFile, 12, NULL, FILE_BEGIN);
bRet = ReadFile(hFile, &vDat, lLen * sizeof(ST_DAT), &dwRead, NULL);
CloseHandle(hFile);
}
void testmydat()
{
// TODO: 在此添加控件通知处理程序代码
// OnOK();
ST_DAT st;
st.fy = 1.23f;
st.nx = 2;
strcpy(st.szBuf, "abd");
vector<ST_DAT> vs;
vs.push_back(st);
st.fy = 2.34f;
st.nx = 99;
strcpy(st.szBuf, "xyz");
vs.push_back(st);

CString strFile = TEXT("c:/mydat.dat");
MyWrite(strFile, vs);
vector<ST_DAT> vrtest;
MyRead(strFile, vrtest);
}
hzy694358 2009-12-04
  • 打赏
  • 举报
回复
具体点,,拜托了
bragi523 2009-12-04
  • 打赏
  • 举报
回复
可以加分隔符
两种分隔符
一种用来分开struct成员
一种用来分开vector成员
「已注销」 2009-12-04
  • 打赏
  • 举报
回复
使用 WriteFile 函数,直接把你的 vector 地址放进去就可以写了。
ljz888666555 2009-12-04
  • 打赏
  • 举报
回复
自己定义格式,然后readstring writestring

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧