Чтение необработанного байтового массива в std :: string - PullRequest
4 голосов
/ 23 декабря 2010

Меня интересует следующая проблема: предположим, у меня есть функция в стиле C, которая считывает необработанные данные в буфер

int recv_n(int handle, void* buf, size_t len);

Можно ли считывать данные непосредственно в std:string или * 1005?* без выделения каких-либо временных буферов?Например,

std::string s(100, '\0');
recv_n(handle, s.data(), 100);

Я полагаю, что это решение имеет неопределенный результат, потому что, afaik, string::c_str и string::data могут возвращать временное местоположение и необязательно возвращать указатель на реальное место в памяти, используемый объектом для хранения данных.

Есть идеи?

Ответы [ 2 ]

10 голосов
/ 23 декабря 2010

Почему бы не использовать vector<char> вместо string?Таким образом, вы можете сделать:

vector<char> v(100, '\0');
recv_n(handle, &v[0], 100);

Это кажется мне более идиоматичным, тем более что вы не используете его как строку (вы говорите, что это необработанные данные).

8 голосов
/ 23 декабря 2010

Да, после C ++ 11.

Но вы не можете использовать s.data(), поскольку он возвращает char const*

Попробуйте:

std::string s(100, '\0');
recv_n(handle, &s[0], 100);

В зависимости отВ этой ситуации я, возможно, выбрал std :: vector специально для необработанных данных (хотя все это будет зависеть от использования данных в вашем приложении).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...