2010-04-24 22 views
1

Je veux créer un programme en C++ qui lit un fichier où chaque champ aura un numéro avant celui qui indique combien de temps il est.Comment utiliser l'indicateur de longueur dans un programme C++

Le problème est que je lis chaque enregistrement dans l'objet d'une classe; comment puis-je rendre les attributs de la classe dynamiques? Par exemple, si le champ est "john", il le lira dans un tableau à 4 caractères.

Je ne veux pas créer un tableau de 1000 éléments car l'utilisation minimale de la mémoire est très importante.

Répondre

1

Pour ce faire, vous devez utiliser l'allocation dynamique (directement ou indirectement).

Si directement, vous avez besoin new[] et delete[]:

char *buffer = new char[length + 1]; // +1 if you want a terminating NUL byte 

// and later 
delete[] buffer; 

Si vous êtes autorisé à utiliser Boost, vous pouvez simplifier ce un peu en utilisant boost::shared_array<>. Avec un shared_array, vous ne devez pas supprimer manuellement la mémoire comme enveloppe de tableau se chargera de cela pour vous:

boost::shared_array<char> buffer(new char[length + 1]); 

Enfin, vous pouvez faire l'allocation dynamique indirectement via des classes comme std::string ou std::vector<char>.

3

Utilisez std::string, qui sera redimensionné pour être suffisamment grand pour contenir le contenu que vous lui attribuez.

2

Si vous voulez juste lire mot par mot à partir du fichier, vous pouvez le faire:

vector<string> words; 
ifstream fin("words.txt"); 
string s; 
while(fin >> s) { 
    words.push_back(s); 
} 

Cela mettra tous les mots du fichier dans le vecteur words, bien que vous perdrez l'espace.

1

Je suppose qu'il n'y a pas d'espace entre les enregistrements, ou que vous écrivez simplement file >> record dans une boucle.

size_t cnt; 
while (in >> cnt) { // parse number, needs not be followed by whitespace 
    string data(cnt, 0); // perform just one malloc 
    in.get(data[0], cnt); // typically perform just one memcpy 
    // do something with data 
}