如何定位并替换文件中的内容
怎么定位并替换文件中的内容
我有一个文件,有一个114项的cstring数组(数组每项的大小不一定一样,有字母/数字/汉字之类的东西),之后是一张jpg图片, 图片的大小保存在前cstring数组的最后一项中,我现在想往里面再存东西, 基本的思路是先读取cstring数组,之后根据里面的两项(姓名/职务)和现在要增加的内容比较,如果相同,则覆盖原来的记录,如果不同,则在文件的最后增加一条记录. 其中读取cstring数组没有问题, 在最后增加记录也没有问题,就是覆盖原有的记录出了问题.
我的代码主要如下:
DWORD locat = 0;
CString temp[114] = { _T("") };
temp[0] = _T("!@#");
CFile file(tPath, CFile::modeReadWrite);
CArchive ar(&file, CArchive::load);
CArchive ar1(&file, CArchive::store);
while (temp[0] == _T("!@#"))
{
//读取文本内容(此处读取的内容都正确)
for (int i = 0; i < 114; i++)
{
ar >> temp[i];
}
if (((temp[1] == save[1])&(temp[32] == save[32])))//如果是同一人(数组的第一和第32项分别是姓名和职务)
{
MessageBox(_T("已有此人员记录,此前记录将被覆盖"));
file.Seek(locat, CFile::begin); //移动到前一条记录后(即读取文本内容前)开始写入,此处位置总是不对
for (int i = 0; i < 114; i++)
{
ar1 << save[i]; //save[i]为需要保存的文本内容
}
ar1.Write(end, long); //这是要替换的图片
temp[0] = _T(""); //结束循环
}
else//若不是同一人(姓名,职务不全部相同)
{
char *tp = new char[_wtoi(temp[113])]; //数组的113项保存图片的大小
ar.Read(tp, _wtoi(temp[113])); //移至下一个记录(原来用过 seek(locat+_wtoi(temp[113]), CFile::begin),但发现定位得不对(就是接着读第二条记录的文本内容时读不出)
locat = file.GetPosition();//获取当前位置
if (locat >= file.GetLength()) //若已到底,则结束
{
temp[0] = _T(" ");
}
}
}
我在只有两条记录的情况下,再往里面增加一个和第二条记录一样的数据, ar >> temp[i]读取正确,之后if的条件不满足,转到执行else里面的, 原来是想根据数组里保存的图片大小往后移位置,结果发现位置不对(不知道该怎么操作),后来用read再读了一次(同时获取位置, 如果下次if判断满足条件,则从该位置开始写入数据), 接着读取数组发现读出的内容正确. 之后满足了if条件转而执行写入, 但写入的位置不知道为什么总是不对,都比原来的那条记录要往下偏移一段,而且也不是固定的数值,不知道该怎么正确操作,望高手指点迷津.
另外刚写这个帖子的时候突然想到,即使位置正确了也还会有一个问题,就是如果重新写入的数据和原来的数据不一样大(这个很有可能,因为插入的图片不一样是固定大小的),那还是会有错误. 该怎么把数组和图片两段一起替换并把之后的数据前移或者后移呢?
补充: jpg图片是用下面方法读进来的, 不知道怎么把前面的 cstring[114]数组和图片这个end数组组合到一个数组里,所以分成了两块写入.
file.GetLength();
cstring *end=new cstring[long];
file.Read(end,long);
------解决思路----------------------
替换文件内容只是是全部把文件内容读到内存中后,对内容修改,然后从新写入到文件中。
我有一个文件,有一个114项的cstring数组(数组每项的大小不一定一样,有字母/数字/汉字之类的东西),之后是一张jpg图片, 图片的大小保存在前cstring数组的最后一项中,我现在想往里面再存东西, 基本的思路是先读取cstring数组,之后根据里面的两项(姓名/职务)和现在要增加的内容比较,如果相同,则覆盖原来的记录,如果不同,则在文件的最后增加一条记录. 其中读取cstring数组没有问题, 在最后增加记录也没有问题,就是覆盖原有的记录出了问题.
我的代码主要如下:
DWORD locat = 0;
CString temp[114] = { _T("") };
temp[0] = _T("!@#");
CFile file(tPath, CFile::modeReadWrite);
CArchive ar(&file, CArchive::load);
CArchive ar1(&file, CArchive::store);
while (temp[0] == _T("!@#"))
{
//读取文本内容(此处读取的内容都正确)
for (int i = 0; i < 114; i++)
{
ar >> temp[i];
}
if (((temp[1] == save[1])&(temp[32] == save[32])))//如果是同一人(数组的第一和第32项分别是姓名和职务)
{
MessageBox(_T("已有此人员记录,此前记录将被覆盖"));
file.Seek(locat, CFile::begin); //移动到前一条记录后(即读取文本内容前)开始写入,此处位置总是不对
for (int i = 0; i < 114; i++)
{
ar1 << save[i]; //save[i]为需要保存的文本内容
}
ar1.Write(end, long); //这是要替换的图片
temp[0] = _T(""); //结束循环
}
else//若不是同一人(姓名,职务不全部相同)
{
char *tp = new char[_wtoi(temp[113])]; //数组的113项保存图片的大小
ar.Read(tp, _wtoi(temp[113])); //移至下一个记录(原来用过 seek(locat+_wtoi(temp[113]), CFile::begin),但发现定位得不对(就是接着读第二条记录的文本内容时读不出)
locat = file.GetPosition();//获取当前位置
if (locat >= file.GetLength()) //若已到底,则结束
{
temp[0] = _T(" ");
}
}
}
我在只有两条记录的情况下,再往里面增加一个和第二条记录一样的数据, ar >> temp[i]读取正确,之后if的条件不满足,转到执行else里面的, 原来是想根据数组里保存的图片大小往后移位置,结果发现位置不对(不知道该怎么操作),后来用read再读了一次(同时获取位置, 如果下次if判断满足条件,则从该位置开始写入数据), 接着读取数组发现读出的内容正确. 之后满足了if条件转而执行写入, 但写入的位置不知道为什么总是不对,都比原来的那条记录要往下偏移一段,而且也不是固定的数值,不知道该怎么正确操作,望高手指点迷津.
另外刚写这个帖子的时候突然想到,即使位置正确了也还会有一个问题,就是如果重新写入的数据和原来的数据不一样大(这个很有可能,因为插入的图片不一样是固定大小的),那还是会有错误. 该怎么把数组和图片两段一起替换并把之后的数据前移或者后移呢?
补充: jpg图片是用下面方法读进来的, 不知道怎么把前面的 cstring[114]数组和图片这个end数组组合到一个数组里,所以分成了两块写入.
file.GetLength();
cstring *end=new cstring[long];
file.Read(end,long);
------解决思路----------------------
替换文件内容只是是全部把文件内容读到内存中后,对内容修改,然后从新写入到文件中。