C++ stl stringstream прямой буферный доступ

Если Вы привыкли думать о ORM-отображенных объектах тогда, это в основном, как работает основанное на объекте хранилище данных как Механизм Приложения Google. Для чего-то как соединения можно посмотреть ссылочные свойства . Вы не должны действительно быть обеспокоены тем, использует ли это BigTable для бэкенда или чего-то еще, так как бэкенд абстрагирован API-интерфейсами Хранилища данных и GQL.

30
задан Kugel 9 December 2009 в 23:14
поделиться

4 ответа

Вы можете вызвать str () , чтобы получить обратно std :: string . Оттуда вы можете вызвать c_str () в std :: string , чтобы получить char * . Обратите внимание, что c_str () официально не поддерживается для этого использования, но все используют его таким образом :)

Edit

Это, вероятно, лучшее решение: std :: istream: : прочтите . Из примера на этой странице:

  buffer = new char [length];

  // read data as a block:
  is.read (buffer,length);
9
ответ дан 28 November 2019 в 00:09
поделиться

std :: stringstream не (обязательно) хранит свой буфер непрерывно, но может выделять фрагменты по мере их постепенного заполнения. Если вы хотите, чтобы все его данные находились в непрерывной области памяти, вам нужно будет скопировать их, и это то, что str () делает за вас.

Конечно, если вы хотите использовать или тогда вы можете написать класс с другой стратегией хранения, но тогда вам вообще не нужно использовать std :: stringstream .

12
ответ дан 28 November 2019 в 00:09
поделиться

Что ж, если вас серьезно беспокоит хранение, вы можете приблизиться к металлу. basic_stringstream имеет метод rdbuf () , который возвращает его basic_stringbuf (полученный из basic_streambuf ). Затем вы можете использовать указатели eback (), , egptr () и gptr () для доступа к символам непосредственно из буфера. Я использовал этот механизм в прошлом для реализации настраиваемого буфера с моей желаемой семантикой, поэтому он выполним.

Осторожно, это не для слабонервных! Выделите несколько дней, прочтите Standard C ++ IOStreams and Locales или подобную придирчивую ссылку и будьте осторожны ...

6
ответ дан 28 November 2019 в 00:09
поделиться

Вы можете получить полный контроль над используемым буфером, записав его самостоятельно и используя этот буфер в stringstream

stringstream membuf(std::ios::in | std::ios::out | std::ios::binary);
membuf.rdbuf(yourVeryOwnStreamBuf);

Ваш собственный буфер должен быть получен из basic_streambuf и соответствующим образом переопределить методы sync () и overflow () .

Для вашего внутреннее представление, вы, вероятно, могли бы использовать что-то вроде vector и Reserve () его до необходимого размера, чтобы не выполнялись перераспределения и копии.

Это означает, что вы знаете верхняя граница необходимого заранее места. Но если вы заранее не знаете размер и вам понадобится постоянный буфер, копий, конечно, неизбежно.

15
ответ дан 28 November 2019 в 00:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: