Преобразование wstring в wchar_t

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

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 Может кто-нибудь объяснить мне, почему данные обрезаются.


person user3043517    schedule 29.06.2015    source источник
comment
Вы уверены, что данные усекаются? Вы, кажется, не проверяете трубку, чтобы увидеть, не осталось ли чего-нибудь, ожидающего чтения. Вы также, кажется, не проверяете, написали ли вы столько байтов, сколько, по вашему мнению, написали.   -  person    schedule 29.06.2015
comment
Прочитав из какого-то потока, не стоит ожидать, что вы получите определенный размер (он может быть меньше или даже равен нулю). Реагировать на некоторую ошибку или условие eof   -  person    schedule 29.06.2015
comment
Разве send_data.str().size() не должно быть send_data.str().size() * sizeof(wchar_t) / sizeof(char), поскольку вы отправляете многобайтовые символы?   -  person NathanOliver    schedule 29.06.2015
comment
@Hurkyl: Да, перед передачей я проверил, что содержат данные в wstringstream. Все данные оказались в наличии. Если я не ошибаюсь, буфер должен печатать все данные, содержащиеся в канале.   -  person user3043517    schedule 29.06.2015
comment
@NathanOliver: Вау! хороший .. Теперь я получаю все данные. Большое спасибо   -  person user3043517    schedule 29.06.2015
comment
@ user3043517: Меня не волнует до или после переноса: меня интересует сам перенос. Не думайте, что WriteFile передаст все, что вы его запросили, и что ReadFile вернет именно то содержимое, которое было записано вызовом WriteFile (если только вы не проверили документацию, чтобы быть уверенным). Многие каналы связи просто так не работают, и судя по аргументам ваших функций, похоже, что этот канал — один из тех, которые не работают.   -  person    schedule 29.06.2015


Ответы (1)


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

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

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

person NathanOliver    schedule 29.06.2015
comment
/ sizeof(char) является избыточным и бесполезным, так как sizeof(char) всегда равно 1 по стандарту C++, даже если char не является 8-битным на каждой платформе (см. CHAR_BIT). Но в Windows char — это 8 бит. - person Remy Lebeau; 30.06.2015
comment
Кроме того, send_data.str() возвращает новый std::wstring при каждом вызове. Передающий код должен сначала сохранить результат send_data.str() в локальную переменную std::wstring, а затем вызвать c_str() и size() для этой переменной. - person Remy Lebeau; 30.06.2015
comment
@RemyLebeau Я понимаю, что sizeof(char) всегда будет 1, но помогает визуализировать, что вы делаете рацион в зависимости от размера символов. Поскольку sizeof() оценивается во время компиляции, код во время выполнения должен быть просто умножен на константу. - person NathanOliver; 30.06.2015