Lecture directement à partir d'un fichier std :: istream dans une chaîne std :: string
Est-il de toute façon de lire un nombre connu d'octets, directement dans un std::string, sans la création d'un tampon temporaire pour le faire?
par exemple actuellement je peux le faire par
boost::uint16_t len;
is.read((char*)&len, 2);
char *tmpStr = new char[len];
is.read(tmpStr, len);
std::string str(tmpStr, len);
delete[] tmpStr;
source d'informationauteur Fire Lancer
Vous devez vous connecter pour publier un commentaire.
std::string
a unresize
fonction que vous pourriez utiliser, ou d'un constructeur qui vais faire la même chose:Ce n'est pas testé, et je ne sais pas si les chaînes sont mandaté pour avoir de stockage contigu.
Vous pouvez utiliser une combinaison de copy_n et un insert_iterator
pas de copie, pas de piratage, pas de possibilité de dépassement, pas de comportement indéfini.
Vous pouvez utiliser quelque chose comme getline:
Je voudrais utiliser un vecteur de la mémoire tampon.
Si vous allez probablement vous en sortir avec l'aide d'une chaîne comme la mémoire tampon (comme décrit par GMan). Il n'est pas garanti par la norme que l'une des chaînes les membres sont dans des emplacements consécutifs (afin de vérifier votre actuelle mise en œuvre et de mettre un gros commentaire qu'il a besoin de vérifier lors du portage d'un autre compilateur/plate-forme).
Êtes-vous juste de l'optimisation de code de longueur ou d'essayer de l'enregistrer vous-même une copie ici? Quel est le problème avec le tampon temporaire?
Je dirais que vous êtes en train de contourner les protections de la chaîne d'essayer d'écrire directement le faire comme ça. Si vous êtes inquiet au sujet de la performance de la copie d'un std::string parce que vous avez identifié que c'est une certaine façon d'affecter les performances de votre application, j'ai travaillé directement avec le char*.
EDIT: en Faire plus à la recherche...
l'initialisation de std::string à partir de char* sans copie
Dans la deuxième réponse, il est indiqué assez clairement que vous ne pouvez pas obtenir ce que vous cherchez à atteindre (ie. remplir une std::string sans une itération sur le char* copie.)
Prendre un coup d'oeil à votre charge routine (le poster ici, peut-être?) et de minimiser les affectations: new et delete ne sont certainement pas gratuit, donc vous pouvez sauver au moins un certain temps si vous n'avez pas à re-créer le tampon constamment. Je trouve qu'il est toujours utile de les effacer par memset avec le tampon à 0 ou null de la fin du premier indice du tableau à chaque itération, mais vous pouvez éliminer rapidement ce code dans les intérêts de la performance une fois que vous êtes confiant dans votre algorithme.
Un moyen simple serait: