Как смешать std :: string с функциями Win32, которые принимают буферы char []? - PullRequest
7 голосов
/ 13 января 2010

Существует ряд функций Win32, которые берут адрес буфера, например TCHAR[256], и записывают некоторые данные в этот буфер. Он может быть меньше размера буфера или всего буфера.

Часто вы вызываете это в цикле, например, для чтения данных из потока или канала. В конце я хотел бы эффективно вернуть строку, которая содержит полные данные из всех повторных вызовов для извлечения этих данных. Я думал использовать std::string, так как его + = оптимизируется аналогично методам StringBuffer.append() / StringBuilder.Append() Java или C #, предпочитая скорость вместо памяти.

Но я не уверен, как лучше сочетать std::string с функциями Win32, так как эти функции для начала принимают char[]. Есть предложения?

Ответы [ 4 ]

11 голосов
/ 13 января 2010

Если аргумент только для ввода , используйте std::string как этот

std::string text("Hello");
w32function(text.c_str());

Если аргумент ввод / вывод , используйте std::vector<char> вместо этого:

std::string input("input");
std::vector<char> input_vec(input.begin(), input.end());
input_vec.push_back('\0');
w32function(&input_vec[0], input_vec.size());
// Now, if you want std::string again, just make one from that vector:
std::string output(&input_vec[0]);

Если аргумент только для вывода , также используйте std::vector<Type>, например:

// allocates _at least_ 1k and sets those to 0
std::vector<unsigned char> buffer(1024, 0);
w32function(&buffer[0], buffer.size());
// use 'buffer' vector now as you see fit

Вы также можете использовать std::basic_string<TCHAR> и std::vector<TCHAR> при необходимости.

Подробнее об этом можно прочитать в книге Скотта Мейерса Effective STL .

6 голосов
/ 13 января 2010

std::string имеет функцию c_str(), которая возвращает эквивалентную строку в стиле C. (const char *)

Далее, std::string имеет перегруженный оператор присваивания, который принимает в качестве ввода строку в стиле C.

например. Пусть ss будет std::string экземпляром и sc будет строкой в ​​стиле C, тогда взаимное преобразование может быть выполнено как:

ss = sc; // from C-style string to std::string
sc = ss.c_str(); // from std::string to C-style string

ОБНОВЛЕНИЕ:

Как отметил Майк Уэллер: если определен макрос UNICODE, то строки будут wchar_t*, и, следовательно, вам придется использовать std::wstring.

6 голосов
/ 13 января 2010

Вместо std :: string я бы предложил использовать std::vector и &v.front() при использовании v.size(). Убедитесь, что место уже выделено!

Вы должны быть осторожны с std::string и двоичными данными.

s += buf;//will treat buf as a null terminated string
s += std::string(buf, size);//would work
2 голосов
/ 13 января 2010
  • Вам необходим совместимый тип строки: typedef std::basic_string<TCHAR> tstring; - хороший выбор.

  • Для аргументов только для ввода можно использовать метод .c_str ().

  • Для буферов выбор несколько менее очевиден:

std :: basic_string не гарантирует использование смежного хранилища, такого как std :: vector. Тем не менее, все реализации std :: basic_string, которые я видел, используют непрерывное хранилище, и комитет по стандартам C ++ считает недостающую гарантию дефектом в стандарте. Дефект был исправлен в черновике C ++ 0x.

Если вы готовы слегка изменить правила - без каких-либо негативных последствий - вы можете использовать & (* aString.begin ()) в качестве указателя на буфер TCHAR длины aString.size (). В противном случае, вы застряли с std :: vector на данный момент.

Вот что стандартная комиссия C ++ может сказать о непрерывном хранении строк:

Не стандартизирует это существующее практика не дает разработчикам больше свободы Мы думали, что это может быть десять лет назад Но производители имеют говорил как со своими реализации, и с их голосом на собраниях LWG. реализации будут смежный независимо от того, что стандарт говорит. Таким образом, стандарт может также дать стринг клиентам больше дизайна выбор.

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