2015-06-29 3 views
2

Я использую связь Namedpipes (C++) для передачи данных между двумя процессами. Ради удобства я использую wstring для передачи данных, и все отлично в конце передачи. Я не могу получить итоговые данные на принимающей стороне. Ниже приведен код передачи.wstring to wchar_t conversion

wstringstream send_data;   
send_data << "10" << " " << "20" << " " << "30" << " " << "40" << " " << "50" << " " << "60" << "\0" ; 
DWORD numBytesWritten = 0; 
result = WriteFile(
    pipe, // handle to our outbound pipe 
    send_data.str().c_str(), // data to send 
    send_data.str().size(), // length of data to send (bytes) 
    &numBytesWritten, // will store actual amount of data sent 
    NULL // not using overlapped IO 
); 

Приведенный конечный код приема.

wchar_t buffer[128]; 
DWORD numBytesRead = 0; 
BOOL result = ReadFile(
    pipe, 
    buffer, // the data from the pipe will be put here 
    127 * sizeof(wchar_t), // number of bytes allocated 
    &numBytesRead, // this will store number of bytes actually read 
    NULL // not using overlapped IO 
); 

if (result) { 
    buffer[numBytesRead/sizeof(wchar_t)] = '\0'; // null terminate the string 
    wcout << "Number of bytes read: " << numBytesRead << endl; 
    wcout << "Message: " << buffer << endl; 

} 

В результате в буфере содержится только 10 20 30 Может кто-то пожалуйста, объясните мне, почему данные будут усечены.

+1

Вы уверены, что данные усечены? Кажется, вы не проверяете трубку, чтобы увидеть, осталось ли что-нибудь, ожидая, чтобы ее прочитали. Вы также не видите, чтобы проверить, написано ли вы столько байтов, сколько вы думаете, что вы написали. – Hurkyl

+0

Имея чтение из какого-то потока, вы не должны ожидать определенного размера (он может быть меньше или даже равен нулю). React on some error или eof condition –

+2

Не следует 'send_data.str(). Size()' be 'send_data.str(). Size() * sizeof (wchar_t)/sizeof (char)', поскольку вы отправляете многобайтовые символы ? – NathanOliver

ответ

0

Вы не отправляете все данные с помощью функции WriteFile(). Вы отправляете send_data.str().size() количество байтов, которое неверно, так как size() дает вам количество символов, а не количество байтов. Вы можете изменить свой код:

send_data.str().size() * sizeof(wchar_t)/sizeof(char) 

который отправит правильное количество байтов.

+0

'/ sizeof (char)' избыточно и бесполезно, поскольку 'sizeof (char)' всегда 1 на стандарт C++, даже если 'char' не 8 бит на каждой платформе (см.' CHAR_BIT'). Но в Windows «char» - 8 бит. –

+0

Кроме того, 'send_data.str()' возвращает новый 'std :: wstring' каждый раз, когда он вызывается. Код отправки должен сначала сохранить результат 'send_data.str()' в локальную переменную 'std :: wstring', а затем вызвать' c_str() 'и' size() 'для этой переменной. –

+0

@RemyLebeau Я понимаю, что 'sizeof (char)' всегда будет 1, но он помогает визуализировать, что вы делаете рацион в размере символов. Поскольку 'sizeof()' оценивается во время компиляции, код во время выполнения должен просто умножаться на константу. – NathanOliver