TMemoryStream 的Memory怎么使用?

wangtaoboy 2002-07-08 08:57:23
现在我得到了一个从数据库来的文件SendFile,想通过MSComm发送出去,又定义了一个Pchar,但发现SendFile->Memory是个空指针,不能对Pchar赋值。不知道能不能直接从内存流中得到字符给MSComm的发送缓冲区,但MSComm发送缓冲区的属性是OleVariant,不知道怎么解决?请大家指点!
...全文
381 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangtaoboy 2002-07-08
  • 打赏
  • 举报
回复
Borlandor兄你好!
感谢你的指点!我现在想做的就是把流的数据以字符串的形式赋值给mscomm 控件的Output,发送数据就由mscomm控件来完成。
上面有位仁兄说了一个例子,我编译通过了,他是将memory 的void*强制转换成char*所以能对字符数组赋值,但我看不懂,为什么还要拿来和16进制的0F来与运算?请仁兄指点一二!
既然是问,就一次问个够:)
不知道仁兄对异常处理有什么心得?或是有这方面的资料吗?
我现在的程序就出现了这样的问题,我用try{}catch(...){}结构但在编译时报告catch那行出错: Expression syntax,statement missing,'catch'expected
不知道什么原因。
Borlandor 2002-07-08
  • 打赏
  • 举报
回复
我想你不是别的原因,TMemoryStream 在LoadFromFile或LoadFromStream后其Position指向了结尾处,所以TMemoryStream.Memory指针为NULL。
你只需将TMemoryStream.Position = 0 然后再使用其即可。
wangtaoboy 2002-07-08
  • 打赏
  • 举报
回复
citywolf兄,项目的需要,还没有必要用Socket发送。因为MSComm控件相对来讲比较容易,所以采用它进行通信。不知道能否告诉我为什么在上面的例子中把流中的数据和16进制的0f进行与运算?我的目的是想从流中得到字符数组,再对它进行数据分析再发送。
citywolf 2002-07-08
  • 打赏
  • 举报
回复
用串口MSCOMM发送?为什么不用Socket发送呢?MSComm只能发送小量的数据帧,用TCP/IP能发送大量的数据
wangtaoboy 2002-07-08
  • 打赏
  • 举报
回复
天涯,你别光看着呀:),帮帮我拉。呵呵。
hansonhx 2002-07-08
  • 打赏
  • 举报
回复
@_@
wangtaoboy 2002-07-08
  • 打赏
  • 举报
回复
再问一下!:)
为什么能用char *就能把void *转换呢?是强制的吗?
在流存储的是2进制字符,和0x0f与运算有什么作用?白痴问题,恳请赐教!:)
因为我是个大菜鸟:)谢谢!
wangtaoboy 2002-07-08
  • 打赏
  • 举报
回复
谢谢2位!size属性是得到流的字符数吧?
为什么还要将字符和16进制数16进行与运算呢?
恳请赐教!
gfh21cn 2002-07-08
  • 打赏
  • 举报
回复
char *ptr=(char *)(stream->Memory)
for(int k=0;k<Stream->Size;k++)
ptr[k]=ptr[k]&0xof;
wangtaoboy 2002-07-08
  • 打赏
  • 举报
回复
大剑师你好,看了HELP文件我知道它是VOID*,在DELPHI中可以直接把它赋值给PCHAR,但在BCB中就不行,可能是我对指针概念不熟悉,恳请你给个例子说明一下,我想得到流的字符,以便我能通过MSCOMM控件发送出去。可能还有个从字符转换到OleVariant的问题,请指点!非常感谢!
佣工7001 2002-07-08
  • 打赏
  • 举报
回复
void *
wangtaoboy 2002-07-08
  • 打赏
  • 举报
回复
谢谢阿星兄!
阿星兄的代码是说通过向Edit1输入个整数作为把指定文件分成几块,每块1024byte吧
codecb 2002-07-08
  • 打赏
  • 举报
回复
使用BCB使用TMemoryStream和TFileStream来做的分割文件程序。


int aim_size=0;
try
{
int Edit1_size=Edit1->Text.ToInt();
aim_size=Edit1_size;
}
catch(...)
{return;}
int k_1024=1024*aim_size;
if (!OpenDialog1->Execute())
return;
String file_name=OpenDialog1->FileName;

if(file_name=="")
Button2Click(Sender);
if(!FileExists(file_name)) file://文件有效
{ShowMessage("无效文件");
return;}
String file_path=ExtractFilePath(file_name);//文件路径
// String file_ext =ExtractFileExt(file_name); file://文件后缀
String file_Na =ExtractFileName(file_name); file://文件名
try
{
TMemoryStream* pms = new TMemoryStream();//原文件
pms->LoadFromFile(file_name);
pms->Seek(0, soFromBeginning);//定位头部
int sizemem=(pms->Size)/k_1024;//n K

if(sizemem>999)
{
ShowMessage("文件超过预定数量,无法分割\n请将分割后文件扩大");
return;

}
wangtaoboy 2002-07-08
  • 打赏
  • 举报
回复
非常感谢Borlandor兄及各位的鼎立帮助!!!
我的OICQ:25485960,
e-Mail:wt_juzi@163.com
真诚结交用BCB编程的朋友!
Borlandor 2002-07-08
  • 打赏
  • 举报
回复
如下使用,最好使用ReadBuffer方法。
void __fastcall TForm1::Button1Click(TObject *Sender)
{
char* p;
TMemoryStream* MemStream;


MemStream = new TMemoryStream;
try
{
MemStream->LoadFromFile("C:\\Temp\\Test.dat");
MemStream->Position = 0;
//p = (char *) MemStream->Memory;
p = new char[MemStream->Size];
MemStream->ReadBuffer(p,MemStream->Size);

Memo1->Lines->Text = p;
}
catch (Exception &exception)
{

}

delete[] p;
MemStream->Free();
}
wangtaoboy 2002-07-08
  • 打赏
  • 举报
回复
天空仁兄,savetostream 是从一个流到另一个流吧。但我是想从流中读出数据发送到mscomm 的发送缓冲区。
三杯倒 2002-07-08
  • 打赏
  • 举报
回复
savetostream

13,825

社区成员

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

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