2017-10-11 15 views
0

Je dois écrire violemment dans un vecteur (pour éviter memcpy superflu).Remplir un vecteur <char> d'une manière à l'ancienne (et sale)

Considérons cette pièce très simplifiée du Code

unsigned read_data (char * buffer , unsigned maxsize) 
    { 
    const char * data = "Hi folks! I'm the data" ; 
    unsigned size = strlen(data) ; 
    if (size > maxsize) return 0 ; 
    memcpy(buffer,data,size) ; 
    return size ; 
    } 

void main() 
    { 
    std::vector<char> v ; 
    v.reserve(50) ; 
    unsigned size = read_data(v.data(),v.capacity()) ; 
    v.force_actual_size(size) ; 
    } 

Voici la façon dont je l'imaginais: les données sont réellement écrites dans le vecteur, mais la taille du vecteur est toujours 0. donc j'ai besoin de cette méthode force_actual_size ...

Y a-t-il un moyen de l'implémenter, ou mieux, une façon propre de faire la même chose.

Et bien sûr, read_data vient d'une ancienne API que je ne peux pas modifier.

+2

'resize' au lieu de' reserve' (et 'la taille()' au lieu de 'capacité()')? – Jarod42

+0

force_actual_size est redimensionner. –

+0

@ manni66: Comme OP l'utilise, vous écraserez les données par "\ 0". – Jarod42

Répondre

3

Vous pouvez utiliser std::vector::resize pour allouer la mémoire dont vous avez besoin et aussi mettre à jour correctement la taille du vecteur:

std::vector<char> v; 
v.resize(50); 
const auto new_size = read_data(v.data(), v.size()); 
v.resize(new_size); 
+0

@ Jarod42: whoops, corrigé. –

+0

Peut-être ajouter une explication pourquoi la version de l'OP n'a pas fonctionné? Je pense que cela serait utile. – Knoep

+0

Cela fonctionne! Je regrette seulement l'initialisation superflue à zéro de l'ensemble du vecteur au premier 'redimensionnement' (bien sûr, dans la vraie vie, mes données sont nettement plus grandes que 50 octets). –