C++ (Qt)#include <iostream>#include <sstream> #include <cstring> using namespace std; int main(int argc, char *argv[]){ /* Исходная строка */ stringstream ss_in("Hello, World!"); clog << "ss_in.str().length() = " << ss_in.str().length() << endl; stringstream ss_intermediate; char buf[8]; size_t bytes_written_into_ss_intermediate = 0; while (ss_in.good()) { /* Читаем данные в буфер. т.к. шифрование * работает с блоками по 64-бита */ memset(buf, 0, 8); ss_in.read(buf, 8); /* Здесь могла бы быть процедура шифрования... */ ss_intermediate.write(buf, 8); bytes_written_into_ss_intermediate += 8; } clog << bytes_written_into_ss_intermediate << " bytes written into ss_intermediate" << endl; clog << "ss_intermediate.str().length() = " << ss_intermediate.str().length() << endl << "'" << ss_intermediate.str() << "'" << endl; stringstream ss_out; size_t bytes_written_into_ss_out = 0; /* А здесь по неясной мне причине в потоке * оказывается 24 байта доступных для чтения, * 16 из которых были в него записаны, * а еще 8 NULL-байтов появились каким-то * непостижимым образом. Может это проделки * запасливого распределителя памяти, заранее * хапнувшего себе еще 8 байт capacity под * будущие нужды, но с какой радости он * пихает их в поток как данные? */ while (ss_intermediate.good()) { memset(buf, 0, 8); ss_intermediate.read(buf, 8); ss_out.write(buf, 8); bytes_written_into_ss_out += 8; } clog << bytes_written_into_ss_out << " bytes written into ss_out" << endl; clog << "ss_out.str().length() = " << ss_out.str().length() << endl << "'" << ss_out.str() << "'" << endl; getc(stdin);}
C++ (Qt)void testWriteAndReadStringstream( ) { const size_t BufferSize = 8; char buf[BufferSize]; string str("Hello, World!"); strncpy_s(buf, BufferSize-1, str.data(), BufferSize); stringstream ss; ss.write(buf, BufferSize); while (EOF != ss.peek()) { ss.read(buf, BufferSize); clog << ss.gcount() << " bytes read" << endl; }}