2012-12-05 53 views
2

我试图通过套接字连接发送的图像,但我有下面的代码有问题:如何从IStream读取字符数组并将其写入另一个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”,但没有使用从原始数据流中读取的char数组构造的“myStreamR”,我会得到它。

输出是两个“OK!”,这意味着所有的字节都被复制到数组中,并且所有的字节都被粘贴到新的数据流中。但是,我检查了savedBytes,并且在read()之后发现值为0(不好),而在write()之后它等于我给出的流大小。那么为什么在地球上阅读()给我一个“S_OK”标志,如果没有什么被读取?

回答

6

将数据写入数据后,您并不寻求MyStreamRImage::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; 
       } 
      } 
     } 
    } 
} 
+0

AAAAH!现在这一切都有道理!在我的生活中,我不会认为寻找者的位置发生了变化。非常感谢你! – Kesarion

+0

除非你实际上正在做'Stat()'和'FromStream()'调用之间的数据,我只是将'myStream'直接传递给'FromStream()',或者至少使用'myStream-> Clone ()'如果你不想'FromStream()'修改'myStream'的当前位置。 –

相关问题