2010-07-18 4 views
1

J'ai un tampon char * pour contenir un fichier que j'ai lu en mode binaire. Je sais que la longueur du fichier est de 70 octets et c'est la valeur utilisée pour produire un tampon de la bonne taille. Le problème est, il y a 17 ou 18 espaces supplémentaires dans le tableau de sorte que certains caractères aléatoires sont ajoutés à la fin. Cela pourrait-il être un problème unicode?MS Visual C++ 2008 char tampon plus long que défini

ulFLen stocke la taille du fichier en octets et a la valeur correcte (70 pour le fichier que je teste sur)

//Set up a buffer to store the file 
pcfBuffer = new char[ulFLen]; 

//Reading the file 
cout<<"Inputting File..."; 
fStream.seekg(0,ios::beg); 
fStream.read(pcfBuffer,ulFLen); 
if(!fStream.good()){cout<<"FAILED"<<endl;}else{cout<<"SUCCESS"<<endl;} 

Répondre

1

Comme il est un tableau char, vous avez probablement oublié un caractère de fin NUL .

La bonne façon dans ce cas serait:

//Set up a buffer to store the file and a terminating NUL character 
pcfBuffer = new char[ulFLen+1]; 

//Reading the file 
cout<<"Inputting File..."; 
fStream.seekg(0,ios::beg); 
fStream.read(pcfBuffer,ulFLen); 
if(!fStream.good()){cout<<"FAILED"<<endl;}else{cout<<"SUCCESS"<<endl;} 

// Add NUL character 
pcfBuffer[ulFLen] = 0; 

Mais notez que vous avez seulement besoin d'un caractère NUL de terminaison pour les routines qui en dépendent, comme des routines de chaîne ou lors de l'utilisation printf à l'aide %s. Si vous utilisez des routines qui utilisent le fait que vous connaissez la longueur (70 caractères), cela fonctionnera sans un caractère NUL, aussi.

+0

Merci, a parfaitement fonctionné – Dox5

0

Ajouter l'extrait ci-dessous après la lecture des données, il va ajouter le zéro de terminaison qui est nécessaire.

Et btw il devrait être pcfBuffer = new char[ulFLen+1];

size_t read_count = fStream.gcount(); 
if(read_count<=ulFlen) 
    pcfBuffer[read_count]=0; 

Cela fonctionne, peu importe le volume de données doit être lu (dans votre cas gcount()devrait toujours revenir 70, de sorte que vous pouvez faire à la suite à la place: pcfBuffer[70]=0;)

Questions connexes