C++ builder 二进制形式读写字符串和图片

ailby0709 2012-04-11 05:49:11
窗体上有控件
TImage image1

TEdit edit1,
怎么将 image1 和 edit1的内容以二进制的形式写到一个文件中
然后在以二进制的形式将image1 和edit1的信息读出来显示在窗体上
请高手指教。
...全文
442 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
yapingdeng 2013-12-18
  • 打赏
  • 举报
回复
可以实现,感谢妖哥
ailby0709 2012-04-13
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

我的测试环境是C++Builder6,所以代码中是按ANSI写的。你用2009以后的版本,由于String默认为UnicodeString,所以需要自己更改代码,使其支持Unicode,注意写入长度,应该是字符串长度x2
[/Quote]
嗯 我用的是CB2010 呵呵 试了一上午

才发现这两个问题 应该是搞定了

结贴了
ccrun.com 2012-04-12
  • 打赏
  • 举报
回复
我的测试环境是C++Builder6,所以代码中是按ANSI写的。你用2009以后的版本,由于String默认为UnicodeString,所以需要自己更改代码,使其支持Unicode,注意写入长度,应该是字符串长度x2
ailby0709 2012-04-12
  • 打赏
  • 举报
回复
一个问题纠结了我一小天。。。
Edit1->Text是UnicodeString类型的,转成c_str()的时候就会出现乱码的情况
需要先转成AnsiStrig类型。。。
还有一个问题就是在输入日文或者中文的时候使用
FileWrite和FileRead,第三个参数需要注意
不管怎么说还是学到了东西
谢谢妖哥!
ailby0709 2012-04-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

下面是一个完整的简单的例程:
一开始初始化一下Image和Edit:
C/C++ code
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Image1->Picture->LoadFromFile("D:\\ccrun\\123.bmp");
Edit1->Text = "测试数据abc好……
[/Quote]

妖哥 貌似TEdit我输入多个字符的时候

在读取的时候只能取到一个字符。
ailby0709 2012-04-11
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

FileRead 读文件函数,第一个参数是文件句柄,第二个读入数据的缓冲,第三个是读数据的长度。
FileWrite 写文件函数,第一个参数是文件句柄,第二个是要写入数据的地址,第三个是写入数据的长度。

稍微查一下帮助,解释的很清楚。

写数据时,按顺序,先写数据的长度(4个字节),再写数据的本身,依次类推。写的时候,先读数据的长度(4个字节),再读取数据本身。
[/Quote]
谢谢妖哥 解释的够清楚
这么晚还来回答问题 辛苦了。
ccrun.com 2012-04-11
  • 打赏
  • 举报
回复
FileRead 读文件函数,第一个参数是文件句柄,第二个读入数据的缓冲,第三个是读数据的长度。
FileWrite 写文件函数,第一个参数是文件句柄,第二个是要写入数据的地址,第三个是写入数据的长度。

稍微查一下帮助,解释的很清楚。

写数据时,按顺序,先写数据的长度(4个字节),再写数据的本身,依次类推。写的时候,先读数据的长度(4个字节),再读取数据本身。
ailby0709 2012-04-11
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

我认为你完全可以举一反三,就算有100个Image,你应该知道怎么做。
[/Quote]

主要我不太理解FileRead和FileRead的用法 呵呵
ccrun.com 2012-04-11
  • 打赏
  • 举报
回复
我认为你完全可以举一反三,就算有100个Image,你应该知道怎么做。
ailby0709 2012-04-11
  • 打赏
  • 举报
回复
是一个图片一个图片往里写,然后在一个字符串一个字符串往里写

然后取的时候按顺序读出来么?
ailby0709 2012-04-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

下面是一个完整的简单的例程:
一开始初始化一下Image和Edit:
C/C++ code
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Image1->Picture->LoadFromFile("D:\\ccrun\\123.bmp");
Edit1->Text = "测试数据abc好……
[/Quote]

非常感谢妖哥,还有一个问题就是控件如果是多个的话怎么处理。。

有4个TEdit和4个TImage

真是不好意思 客户刚提的要求
ccrun.com 2012-04-11
  • 打赏
  • 举报
回复
需要说明两点:
1. 我不能保证你的机器上D盘下也存在一个ccrun的目录,所以,请更改这个目录名。
2. 以上代码中,Image中存放的必须是位图(Bitmap),如果需要适应其他格式的图片,请自己修改。
3. 测试环境为C++Builder 6.0 + Windows 7
ccrun.com 2012-04-11
  • 打赏
  • 举报
回复
下面是一个完整的简单的例程:
一开始初始化一下Image和Edit:
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Image1->Picture->LoadFromFile("D:\\ccrun\\123.bmp");
Edit1->Text = "测试数据abc好";
}


在Button1的点击事件中将Image中的位图和Edit中的文本内容写到指定的文件中:
// ---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
String strFileName = "D:\\ccrun\\123.ccrun";

// 打开或创建目标文件
int nFileHandle;
if (FileExists(strFileName))
nFileHandle = FileOpen(strFileName, fmOpenWrite);
else
nFileHandle = FileCreate(strFileName);

// 定位到文件头
FileSeek(nFileHandle, 0x0, 0);

// 将Image中的位图存入流中
TMemoryStream *ms = new TMemoryStream;
Image1->Picture->Bitmap->SaveToStream(ms);

// 先将图像流的大小写到文件中
DWORD dw = ms->Size;
FileWrite(nFileHandle, &dw, sizeof(dw));

// 再将图像流写到文件中
FileWrite(nFileHandle, ms->Memory, ms->Size);

// 接着写入Edit1中的文本长度
dw = Edit1->Text.Length();
FileWrite(nFileHandle, &dw, sizeof(dw));

// 再将Edit中的文本写入文件
FileWrite(nFileHandle, Edit1->Text.c_str(), Edit1->Text.Length());

delete ms;

FileClose(nFileHandle);
}


在Button2的点击事件中将Image和Edit清空:
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Image1->Picture->Assign(NULL);
Edit1->Clear();
}


在Button3的点击事件中从文件中读取位图并显示在Image上,同时读取文本内容显示在Edit中:
void __fastcall TForm1::Button3Click(TObject *Sender)
{
String strFileName = "D:\\ccrun\\123.ccrun";

// 打开或创建目标文件
int nFileHandle;
if (FileExists(strFileName))
nFileHandle = FileOpen(strFileName, fmOpenRead);
else
{
ShowMessage("目标文件未找到.");
return;
}

// 定位到文件头
FileSeek(nFileHandle, 0x0, 0);

// 先读取图像流的大小
DWORD dw;
FileRead(nFileHandle, &dw, sizeof(dw));

// 根据图像流的大小,从文件中读取图像流
TMemoryStream *ms = new TMemoryStream;
byte *p = new byte[dw];
FileRead(nFileHandle, p, dw);
ms->Write(p, dw);
delete []p;

// 将图像流中的位图显示在Image上
ms->Position = 0;
Image1->Picture->Bitmap->LoadFromStream(ms);

// 接着读取文本的长度
FileRead(nFileHandle, &dw, sizeof(dw));

// 然后读取指定长度的内容到Edit中
char *str = new char[dw + 1];
FileRead(nFileHandle, str, dw);
str[dw] = 0x0;
Edit1->Text = str;

delete []str;

delete ms;

FileClose(nFileHandle);
}
ailby0709 2012-04-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

使用fread()函数
[/Quote]

能说的具体点吗?
我是必胜客 2012-04-11
  • 打赏
  • 举报
回复
使用fread()函数

13,871

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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