用CString类读写文件

yyang0514 2008-04-18 06:59:44
我在编写一个文件读写的时,当我写入的结构体里面的变量有数值和字符串的时候,用CString对象进行读写的时候怎么才能保证,读的时候完全还原。令我感觉比较困难的是因为在写入文件的时候,所写的字符串是不定长度的。而且也又两个相同类型的数据可能是连续写入的(譬如说两个整形或者是两个字符串)。
...全文
473 点赞 收藏 11
写回复
11 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
菜牛 2008-04-20
说道文件格式顺便说一下MFC序列化的方法,希望对其他人也有帮助。
MFC序列化在写的时候就是先写入类名,读取的时候根据类名先生成一个相应的对象(也就是动态创建),然后读入数据来填充这个对象使之正确初始化。比如CString写入的时候先写入类名,然后是字符串长度,然后是字符串;读取的时候读到CString的类名就先生成一个CString对象,再根据读到的长度读取相应的字符串给这个对象赋值,这样就可以实现序列化和动态创建了。有心思的朋友可以看看CArchive的源码。
回复
菜牛 2008-04-20
建议你找一个文件格式的文档看看,比如位图文件。
你的方式是二进制写入的,对于字符串,如果格式固定(顺序),那么逐个写/读入数据,到字符串的位置写的时候先写字符串长度,然后写字符串,读的时候先读入字符串长度,然后分配字符串空间,读入需要的字符串。用CString类也可以用GetBuffer(长度)来分配好空间读入字符串。如果格式不固定(顺序不定),那么对于每种数据类型要有一个标示,这个类型是定长的话不需要长度,直接写入标示和数据,读取的时候先读取标示,根据标示用合适的数据类型来读入;对于字符串除了标示还要写入长度,读取的时候和上面一样先读长度再按照长度来读取字符串。
回复
kingstarer 2008-04-20
首先在文件前面写上字符串长度有多少 读的时候根据这个动态分配内存
回复
yyang0514 2008-04-20
我主要想实现的功能是:对存储数据进行效率相对较高的查找和排序,查找的关键字可能是数值也可能是字符串.但是不会运行ODBC进行数据库的操作.所以只好用文件读写来完成.所以才遇到对文件读写的麻烦.请各位指点.....
谢谢.
回复
yyang0514 2008-04-19
楼上的代码有问题,需要将文件打开的参数全部标志前面全部加上CFILE::
回复
yyang0514 2008-04-19
我的例子是MFC中的:

void FileWrite()
{
CFile file.Open("1.bin",CFile::modeCreate | modeWrite | typeBinary);
CString str="编程爱好者论坛";//str关联空间,长度不定
int Length=str.GetLength();//返回不带结束符的字符串长度;

file.Write(str.GetBuffer(),Length);
str.ReleaseBuffer();
int num=1231; //NUM同样与控件关联
char *p=new char[5];
/*这里还有问题,因为整数长度同样是定长的,当字符串的长度是4+1时,写入的没有问题,但是当字符小于5时就不能正确写入了,例如num=12;*/
sprintf(p,"%d",num);
file.Write(p,5);
delete p;
file.Close();

//所以在写入数值应该怎么写,写字符的时候又应该怎么控制.
}
void FileRead()
{
CFile file.Open("1.bin",CFile::modeCreate | modeRead | typeBinary);
CString str;

//file.Read() 应该怎么去完成呢

}
回复
zgl7903 2008-04-19
写入时
f.Write(s.GetBuffer(1),s.GetLength());

读出时
len = f.GetLength(); //获取文件大小
s.GetBufferSetLength(len); //分配缓冲区
f.Read(s.GetBuffer(1),len);//读入

严谨的将需要判断非法字符等
回复
yyang0514 2008-04-19
我在MFC中的文件类CFile下的WRITE和READ.
我觉得比较困难的是,不知道写入的后的长度,所以在用READ进行读的时候应该去设定多大的空间呢.
我是否需要在写的时候就把文本的长度给写进去然后在读的时候就不会多读或者少度了.
回复
tunogoro 2008-04-18
不太明白你用什么函数读写?
回复
Kudeet 2008-04-18
很显然,你应该让相同类型的数据写入相同的长度,不够的时候用0填充即可。
回复
caixingxin 2008-04-18
怎么写的就怎么读可以了吧~~
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2008-04-18 06:59
社区公告

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