Чтение непосредственно из станд.:: istream в станд.:: строка

Это - глупое поручение. Слишком много исключений, чтобы быть в состоянии сделать это детерминировано. Если бы Вы делали это, чтобы предварительно обработать список для дальнейшего рассмотрения, то я утвердил бы, что меньше, конечно, было бы больше.

  1. Полоса приветы, заголовки и суффиксы поколений (большой regex или несколько маленьких)
  2. , если только одно имя, это является 'последним'.
  3. , Если только два имени разделяют их сначала в последний раз.
  4. , Если три маркера и середина начальное разделение их сначала, середину, в последний раз
  5. Вид остальные вручную.

Дальнейшая обработка, как почти гарантируют, создаст больше работы, поскольку необходимо пройти переобъединение что раскол обработки.

13
задан Fire Lancer 29 November 2009 в 18:31
поделиться

4 ответа

std :: string имеет функцию resize , которую вы могли бы использовать, или конструктор, который будет делать то же самое:

boost::uint16_t len;
is.read((char*)&len, 2);

std::string str(len, '\0');
is.read(&str[0], len);

Это не проверено, и я не знаю, обязано ли строкам иметь непрерывное хранилище.

11
ответ дан 1 December 2019 в 22:39
поделиться

Вы можете использовать что-то вроде getline:

#include <iostream>
#include <string>
using namespace std;

int main () {
  string str;
  getline (cin,str,' ');
}
2
ответ дан 1 December 2019 в 22:39
поделиться

I would use a vector as the buffer.

boost::uint16_t len;
is.read((char*)&len, 2); // Note if this file was saved from a different architecture 
                         // then endianness of these two bytes may be reversed.

std::vector buffer(len);  // uninitialized.
is.read(&buffer[0], len);

std::string  str(buffer.begin(),buffer.end());

Though you will probably get away with using a string as the buffer (as described by GMan). It is not guaranteed by the standard that a strings members are in consecutive locations (so check your current implementation and put a big comment that it needs checking when porting to another compiler/platform).

2
ответ дан 1 December 2019 в 22:39
поделиться

Вы просто оптимизируете длину кода или пытаетесь сохранить здесь копию? Что не так с временным буфером?

Я бы сказал, что вы на самом деле обходите защиту строки, пытаясь писать напрямую, сделайте это вот так. Если вас беспокоит производительность копирования в std :: string, потому что вы определили, что это каким-то образом влияет на производительность вашего приложения, я бы работал напрямую с char *.

РЕДАКТИРОВАТЬ: Делать больше Ищу... инициализация std :: string из char * без копирования

Во втором ответе довольно четко сказано, что вы не можете достичь того, чего хотите достичь (т.е. заполнить std :: string без итерации над символом * для копирования.)

Взгляните на свою процедуру загрузки (возможно, разместите ее здесь?) и минимизируйте выделение: new и delete, безусловно, не бесплатны, так что вы можете хотя бы сэкономить время, если вы этого не сделаете придется постоянно воссоздавать буфер. Я всегда считаю полезным стереть его, установив для буфера значение 0 или нулевое завершение первого индекса массива на каждой итерации, но вы можете быстро удалить этот код в интересах производительности, когда будете уверены в своем алгоритме.

0
ответ дан 1 December 2019 в 22:39
поделиться
Другие вопросы по тегам:

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