2011-02-07 2 views
0

J'utilise C++, Visual Studio 2010 Premium sur Windows 7, et dans ma demande j'ai un std :: variable chaîne qui échoue sur append :(...C++ problème std :: string en utilisant VC10

la situation est la variable de chaîne contient une énorme quantité de caractères en annexe à des moments différents, la première fois que j'ajoute par exemple 7609 octets, deuxième fois 8184 et enfin 1463, quelque chose comme

std::string str; 
long bytesRead; 
char buffer[BUFFER_SIZE]; 

do { 
    bytesRead = ReadChars(buffer, BUFFER_SIZE -1); 
    buffer[bytesRead] = 0; // I omitted this line before, but it was in the original code 
    if (bytesRead > 0)  
     str += buffer; // I'm already taking care of the char 0 at the end :) 
} while (bytesRead > 0); 

donc chaque fois que j'appelle + = (ou ajouter, même résultat) il ajoute une chaîne supplémentaire (7 ou 8 derniers caractères du tampon original) par exemple

tampon d'origine se termine "chaîne ajoutée"

après append, str se termine "string appendedappended"

ne quelqu'un sait si cela est un problème connu? ou peut-être si je raté quelque chose

Je mets cela dans les commentaires là-bas, mais peut-être mieux si je le mets ici aussi

ReadChars: lire un bounch de caractères et retourne le nombre d'octets lus

bytesRead: si on le lit, il est> 0 ... donc est autorisé à traiter comme tampon ASCIIZ,

J'ai essayé avec la fonction append, mais obtenir même comportement (comme celui-ci str.append (tampon);)

Cordialement Jorge

+1

Comment prenez-vous soin du caractère \ 0 à la fin de la mémoire tampon? Cela ressemble aux résultats si vous ne l'avez pas fait. S'il vous plaît montrer votre code sans omettre quelque chose d'important. –

+2

Pouvez-vous publier l'implémentation de ReadChars?Le bug est presque certainement dans la gestion de cette fonction de 'buffer' – JaredPar

+0

Vous mettez probablement le caractère nul au mauvais décalage dans' buffer' – Marlon

Répondre

5

Cet extrait est-il votre code actuel? Que voulez-vous dire par "prendre soin de l'om 0"?

do { 
    bytesRead = ReadChars(buffer, BUFFER_SIZE); 
    if (bytesRead > 0) 
     str += buffer; // I'm already taking care of the char 0 at the end :) 
} while (bytesRead > 0); 

Dans votre exemple, vous ajoutez toujours le tampon entier à la chaîne, sans tenir compte bytesRead efficacement. Donc, std::string va lire buffer jusqu'à ce qu'un octet NULL soit trouvé - ce qui pourrait causer des débordements et n'est certainement pas ce que vous voulez.

Vous devez indiquer le nombre d'octets à partir de buffer pour ajouter. Effectuez les opérations suivantes à la place:

do { 
    bytesRead = ReadChars(buffer, BUFFER_SIZE); 
    if (bytesRead > 0) 
     str.append(buffer, buffer + bytesRead); 
} while (bytesRead > 0); 
+0

ou 'buffer [bytesRead] = '\ 0';' ---> 'str + = tampon;' – Marlon

+0

Ouais , sauf si 'bytesRead == BUFFER_SIZE' :) –

+2

@Marlon: Pourquoi effectuer une opération d'écriture supplémentaire lorsque vous pouvez vous en tenir à lire uniquement? De plus, lorsque vous passez des itérateurs à accès aléatoire (dont 'char *' est) à 'std :: string :: append()', la fonction peut pré-calculer la longueur de la séquence ajoutée, mais pas si vous venez de passer un seul 'char *'. Et s'il connaît la longueur requise à l'avance, il peut pré-allouer la mémoire, plutôt que de croître de plus en plus jusqu'à ce qu'il trouve «\ 0». Quoi qu'il en soit, en supposant que ReadChars() ne soit pas censé ajouter "\ 0" lui-même, c'est, IMO, la meilleure solution. – sbi

0

Vous avez dit que vous avez déjà pris soin de « 0 » à la fin ... êtes-vous sûr de ne pas supprimer le caractère d'espace à partir de la fin de chaque chaîne que vous tentez d'ajouter?

+0

Oui, je suis sûr, je simplifie simplement le code à poster ici :) – Jorge

0

Sans information sur ReadChars cela ressemble exactement commebuffer ne et mis fin à std::string sont pas nuls est apposent caractère du tampon jusqu'à ce qu'il frappe un 0 aléatoire dans la mémoire.

+0

bien n'est pas exactement aléatoire, il est toujours 7 ou 8 caractères de l'information ajoutée – Jorge

Questions connexes