c++ Builder读取TMemoryStream缓冲区到void指针



我试图将TMemoryStream缓冲区的内容复制到void指针,下面您可以看到不工作的示例代码- void缓冲区为空,但文本框包含有效的大小-我用winrar大小检查了它。下面的代码创建了一个exe文件,但是它的大小是0。

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TMemoryStream* ms = new TMemoryStream();
    Download->Get("http://rarlab.com/rar/wrar521pl.exe",ms);
    this->Edit1->Text = ms->Size;
    void* buffer = malloc(ms->Size );
    ms->Read(buffer,ms->Size);
    FILE* pFile = fopen("test.exe","wb");
    fwrite(buffer,4,ms->Size,pFile);
    fclose(pFile);
    delete ms;
}

另外,我知道我可以很容易地将TMemoryStream缓冲区的内容保存到文件中,但是我需要它的内容作为void指针,所以我编写了以下代码来测试它:

从流中读取的代码几乎是正确的。在读取之前,您没有将流的Position属性重置为0,因此您实际上是从流的末尾读取,那里没有数据可读。

试试这个:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TMemoryStream* ms = new TMemoryStream();
    try
    {
        Download->Get("http://rarlab.com/rar/wrar521pl.exe", ms);
        ms->Position = 0; // <-- ADD THIS
        Edit1->Text = ms->Size;
        void* buffer = malloc(ms->Size);
        if (buffer)
        {
            ms->ReadBuffer(buffer, ms->Size);
            // ms->SaveToFile("test.exe");
            FILE* pFile = fopen("test.exe", "wb");
            if (pFile)
            {
                fwrite(buffer, 1, ms->Size, pFile);
                fclose(pFile);
            }
            free(buffer);
        }
    }
    __finally
    {
        delete ms;
    }
}

或者,干脆不分配单独的缓冲区,直接使用流自己的缓冲区:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TMemoryStream* ms = new TMemoryStream();
    try
    {
        Download->Get("http://rarlab.com/rar/wrar521pl.exe", ms);
        Edit1->Text = ms->Size;
        void* buffer = ms->Memory;
        // ms->SaveToFile("test.exe");
        FILE* pFile = fopen("test.exe", "wb");
        if (pFile)
        {
            fwrite(buffer, 1, ms->Size, pFile);
            fclose(pFile);
        }
    }
    __finally
    {
        delete ms;
    }
}

最新更新