Как читать из 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», но не с «myStreamR», который построен из массива char, считанного из исходного потока.

Вывод двух «OK!» Означает, что все байты копируются в массив и все они вставляются в новый поток. Однако я проверил saveBytes и обнаружил, что после read () это значение равно 0 (не очень), а после write () оно равно размеру потока, который я дал. Тогда почему на земле read () дает мне флаг «S_OK», если ничего не читается?

2

Решение

Вы не ищете 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;
}
}
}
}
}
6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]