簡體   English   中英

如何從IStream讀取到char數組並將其寫入另一個IStream?

[英]How to read from IStream to a char array and write it to another IStream?

我正在嘗試通過套接字連接發送圖像,但是以下代碼存在問題:

//stream to char array
STATSTG myStreamStats;
ULONG bytesSaved;
myStream->Stat(&myStreamStats, 0);
char* streamData = new char[myStreamStats.cbSize.QuadPart];
if(myStream->Read(streamData, myStreamStats.cbSize.QuadPart, &bytesSaved) == S_OK)
    cout<<"OK!"<<endl;
else
    cout<<"Not OK!"<<endl;

//char array to stream
if(myStreamR->Write(streamData, myStreamStats.cbSize.QuadPart, &bytesSaved) == S_OK)
    cout<<"OK!"<<endl;
else
    cout<<"Not OK!"<<endl;

//saving the image to a file
myImage = Image::FromStream(myStreamR);
myImage->Save(lpszFilename, &imageCLSID, NULL);

該程序可以編譯並運行,但是我沒有得到我的圖像。 如果我使用原始的“ myStream”,但不使用“ myStreamR”(由從原始流讀取的char數組構造而成),則會得到它。

輸出為兩個“ OK!”,這意味着將所有字節都復制到數組中,並將所有字節粘貼到新流中。 但是,我檢查了saveBytes,發現在read()之后它的值為0(不好),而在write()之后它的值等於我給的流大小。 那么為什么在地球上read()如果什么也沒讀給我一個“ S_OK”標志呢?

將數據寫入MyStreamR之后,您並不需要將MyStreamR重新找回。 Image::FromStream()從流的當前位置開始讀取,因此,如果您不向后搜索,則將沒有數據可供讀取。

嘗試這個:

STATSTG myStreamStats = {0};
if (FAILED(myStream->Stat(&myStreamStats, 0)))
    cout << "Stat failed!" << endl;
else
{
    char* streamData = new char[myStreamStats.cbSize.QuadPart];

    ULONG bytesSaved = 0;
    if (FAILED(myStream->Read(streamData, myStreamStats.cbSize.QuadPart, &bytesSaved)))
        cout << "Read failed!" << endl;
    else
    {
        //char array to stream
        if (FAILED(myStreamR->Write(streamData, bytesSaved, &bytesSaved)))
            cout << "Write failed!" << endl;
        else
        {
            LARGE_INTEGER li;
            li.QuadPart = 0;

            if (FAILED(myStreamR->Seek(li, STREAM_SEEK_SET, NULL)))
                cout << "Seek failed!" << endl;
            else
            {
                //saving the image to a file
                myImage = Image::FromStream(myStreamR);
                if (myImage1->GetLastStatus() != Ok)
                    cout << "FromStream failed!" << endl;
                else
                {
                    if (myImage->Save(lpszFilename, &imageCLSID, NULL) != Ok)
                        cout << "Save failed!" << endl;
                    else
                        cout << "OK!" << endl;
                }
            }
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM