C++builder 保存字符串

爱上未来你 2013-07-11 02:01:18
这是我写的两个保存和打开字符串的代码

 
void SaveStringToStream(TMemoryStream* stream, String str)
{

int length = 2*str.Length();
stream->Write(&length,sizeof(length));
stream->Write(str.c_str(),length);
stream->SaveToFile("C:\\Users\\Administrator\\Desktop\\123.tcs");

}


//---------------------------------------------------------------------------
//从流中读取字符串
void OpenStringFromStream(TMemoryStream* stream,String& str)
{

int length ;
stream->LoadFromFile("C:\\Users\\Administrator\\Desktop\\123.tcs");
stream->Read(&length,sizeof(length));
WideChar* strs = new WideChar[length+1];
stream->Read(strs,length);
str = String(strs);
ShowMessage(str);
delete[] strs;

}


测试了一下保存都没错,就是打开的时候总是显示乱码,怎么解决????分剩的不多了

,还望高手给解决一下,谢谢
...全文
169 点赞 收藏 19
写回复
19 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
爱上未来你 2013-07-12
引用 17 楼 sololie 的回复:
哇靠,LZ头像好衰哦,好久没见过这么拉风的头像了
此头像瞬间阐述了一个屌丝java程序员想转到c++程序的心情
回复
爱上未来你 2013-07-12
引用 15 楼 ccrun 的回复:
void SaveStringToStream(TMemoryStream *stream, String str)
{
	int length = 2 * str.Length();
	stream->Write(&length, sizeof(length));
	stream->Write(str.c_str(), length);

	stream->SaveToFile("E:\\Temp\\123.tcs");
}

void OpenStringFromStream(TMemoryStream *stream, String &str)
{
	stream->LoadFromFile("E:\\Temp\\123.tcs");
	stream->Position = 0;

	int length;
	stream->Read(&length, sizeof(length));

	WideChar *strs = new WideChar[length / 2 + 1];
	stream->Read(strs, length);
	strs[length / 2] = 0x0;

	str = String(strs);
	ShowMessage(str);

	delete []strs;
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
	TMemoryStream *ms = new TMemoryStream;

	String src = L"不要把简单的问题复杂化,hahaha!";
	SaveStringToStream(ms, src);

	String dst;
	OpenStringFromStream(ms, dst);

	delete ms;
}
受教了 版主
回复
sololie 2013-07-11
哇靠,LZ头像好衰哦,好久没见过这么拉风的头像了
回复
ccrun.com 2013-07-11
注意,以上代码只适用于2010及以上的版本。 因为在2010及以后的版本中,String默认为UnicodeString
回复
ccrun.com 2013-07-11
void SaveStringToStream(TMemoryStream *stream, String str)
{
	int length = 2 * str.Length();
	stream->Write(&length, sizeof(length));
	stream->Write(str.c_str(), length);

	stream->SaveToFile("E:\\Temp\\123.tcs");
}

void OpenStringFromStream(TMemoryStream *stream, String &str)
{
	stream->LoadFromFile("E:\\Temp\\123.tcs");
	stream->Position = 0;

	int length;
	stream->Read(&length, sizeof(length));

	WideChar *strs = new WideChar[length / 2 + 1];
	stream->Read(strs, length);
	strs[length / 2] = 0x0;

	str = String(strs);
	ShowMessage(str);

	delete []strs;
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
	TMemoryStream *ms = new TMemoryStream;

	String src = L"不要把简单的问题复杂化,hahaha!";
	SaveStringToStream(ms, src);

	String dst;
	OpenStringFromStream(ms, dst);

	delete ms;
}
回复
橡木疙瘩 2013-07-11
糊涂了……脑子有点乱。

    length /= 2;//加上这一句
    WideChar* strs = new WideChar[length+1];
    stream->Read(strs,length * 2);
分配空间和设置“零结束符”时除以2,读的时候用原值。
回复
Jenf_Mu 2013-07-11
引用 12 楼 kingxie123 的回复:
[quote=引用 11 楼 Jenf_Mu 的回复:] 下载notepad++,用这个打开,在"格式"菜单里不同的编码查看文件. 还有一个二进制文件查看器. 不要感觉扩展名是txt的,编码方式就都一样.
。。。。。和扩展名有关系吗[/quote] 本来还想解释解释,算了,免得被喷.进这个贴,也是因为N年前我也是Borland C++ Builder 6.0爱好者,现在还有人用它,挺难得的
回复
爱上未来你 2013-07-11
引用 11 楼 Jenf_Mu 的回复:
下载notepad++,用这个打开,在"格式"菜单里不同的编码查看文件. 还有一个二进制文件查看器. 不要感觉扩展名是txt的,编码方式就都一样.
。。。。。和扩展名有关系吗
回复
Jenf_Mu 2013-07-11
下载notepad++,用这个打开,在"格式"菜单里不同的编码查看文件. 还有一个二进制文件查看器. 不要感觉扩展名是txt的,编码方式就都一样.
回复
爱上未来你 2013-07-11
引用 6 楼 u010936098 的回复:
没用过XE4,用过的最后一个版本就是6 如果XE4中String是Unicode的,那么这样试试:

void SaveStringToStream(TMemoryStream* stream, String str)
{
 
    int length = 2*str.Length();
    stream->Write(&length,sizeof(length));
    stream->Write(str.c_str(),length);
    stream->SaveToFile("C:\\Users\\Administrator\\Desktop\\123.tcs");
 
}

//从流中读取字符串
void OpenStringFromStream(TMemoryStream* stream,String& str)
{
 
    int length ;
    stream->LoadFromFile("C:\\Users\\Administrator\\Desktop\\123.tcs");
    stream->Read(&length,sizeof(length));
    length /= 2;//加上这一句
    WideChar* strs = new WideChar[length+1];
    stream->Read(strs,length);
    strs[length] = L'\0';//加上这一句
    str = String(strs);
    ShowMessage(str);
    delete[] strs;
}
这个 length /= 2;//加上这一句 是不行的,因为保存的时候是宽整形保存的,读取的时候是不能/2的。
回复
爱上未来你 2013-07-11
引用 8 楼 zhao4zhong1 的回复:
请帖主移驾C++Builder论坛http://bbs.csdn.net/forums/BCB
哦 好的
回复
赵4老师 2013-07-11
请帖主移驾C++Builder论坛http://bbs.csdn.net/forums/BCB
回复
赵4老师 2013-07-11
请帖主意见C++Builder论坛。http://bbs.csdn.net/forums/BCB
回复
橡木疙瘩 2013-07-11
没用过XE4,用过的最后一个版本就是6 如果XE4中String是Unicode的,那么这样试试:

void SaveStringToStream(TMemoryStream* stream, String str)
{
 
    int length = 2*str.Length();
    stream->Write(&length,sizeof(length));
    stream->Write(str.c_str(),length);
    stream->SaveToFile("C:\\Users\\Administrator\\Desktop\\123.tcs");
 
}

//从流中读取字符串
void OpenStringFromStream(TMemoryStream* stream,String& str)
{
 
    int length ;
    stream->LoadFromFile("C:\\Users\\Administrator\\Desktop\\123.tcs");
    stream->Read(&length,sizeof(length));
    length /= 2;//加上这一句
    WideChar* strs = new WideChar[length+1];
    stream->Read(strs,length);
    strs[length] = L'\0';//加上这一句
    str = String(strs);
    ShowMessage(str);
    delete[] strs;
}
回复
爱上未来你 2013-07-11
引用 4 楼 kingxie123 的回复:
[quote=引用 3 楼 u010936098 的回复:]
//从流中读取字符串
void OpenStringFromStream(TMemoryStream* stream,String& str)
{
 
    int length ;
        stream->LoadFromFile("C:\\Users\\Administrator\\Desktop\\123.tcs");
    stream->Read(&length,sizeof(length));
    char * strs = new char[length+1];
    stream->Read(strs,length);
    strs[length] = '\0';
    str = String(strs);
        ShowMessage(str);
    delete[] strs;
 
}
这个在c++builder 6上时可以的,但同样的代码我拷贝到c++builder XE4 就不行了,老是乱码。什么情况啊。 [/quote] 真的是完全拷贝 一点没变
回复
爱上未来你 2013-07-11
引用 3 楼 u010936098 的回复:
//从流中读取字符串
void OpenStringFromStream(TMemoryStream* stream,String& str)
{
 
    int length ;
        stream->LoadFromFile("C:\\Users\\Administrator\\Desktop\\123.tcs");
    stream->Read(&length,sizeof(length));
    char * strs = new char[length+1];
    stream->Read(strs,length);
    strs[length] = '\0';
    str = String(strs);
        ShowMessage(str);
    delete[] strs;
 
}
这个在c++builder 6上时可以的,但同样的代码我拷贝到c++builder XE4 就不行了,老是乱码。什么情况啊。
回复
橡木疙瘩 2013-07-11
//从流中读取字符串
void OpenStringFromStream(TMemoryStream* stream,String& str)
{
 
    int length ;
        stream->LoadFromFile("C:\\Users\\Administrator\\Desktop\\123.tcs");
    stream->Read(&length,sizeof(length));
    char * strs = new char[length+1];
    stream->Read(strs,length);
    strs[length] = '\0';
    str = String(strs);
        ShowMessage(str);
    delete[] strs;
 
}
回复
爱上未来你 2013-07-11
新手啊。。。请大家帮帮忙,万分感谢。
回复
橡木疙瘩 2013-07-11
WideChar* strs = new WideChar[length+1]; 改为 char* strs = new char[length+1];
回复
相关推荐
发帖
C++ Builder
创建于2007-08-02

1.3w+

社区成员

C++ Builder相关内容讨论区
申请成为版主
帖子事件
创建了帖子
2013-07-11 02:01
社区公告
暂无公告