2010-07-15 3 views
1

J'utilise le cstdio (stdio.h) pour lire et écrire des données à partir de fichiers binaires. Je dois utiliser cette bibliothèque en raison de l'ancien code et il doit être compatible avec Windows et Linux. J'ai un FILE* basefile_ que j'utilise pour lire dans les variables configLabelLength et configLabel, où configLabelLength me dit combien de mémoire à allouer pour configLabel.Puis-je lire une variable de longueur dynamique en utilisant fread sans pointeurs?

unsigned int configLabelLength; // 4 bytes 
char* configLabel = 0;   // Variable length 

fread((char *) &configLabelLength, 1, sizeof configLabelLength, baseFile_); 
configLabel = new char[configLabelLength]; 
fread(configLabel,1, configLabelLength,baseFile_); 

delete [] configLabel; // Free memory allocated for char array 
configLabel = 0; // Be sure the deallocated memory isn't used 

Est-il possible de lire dans configLabel sans l'aide d'un pointeur? Par exemple, existe-t-il une solution où je peux utiliser la bibliothèque de vecteurs C++ ou quelque chose où je n'ai pas à me soucier de la gestion de la mémoire du pointeur.

+0

Y at-il une raison pour laquelle vous n'utilisez pas les flux de fichiers C++? – Cogwheel

+0

@Cog: Tout en haut de la question. :) Et +1 pour chercher à utiliser le vecteur. – GManNickG

+0

@Cogwheel Je suis obligé d'utiliser 'cstdio (stdio.h)' en raison du code existant. Je sais que ce n'est pas idéal. – Elpezmuerto

Répondre

5

Il suffit de faire:

unsigned int configLabelLength; // 4 bytes* 
fread((char *) &configLabelLength, 1, sizeof configLabelLength, baseFile_); 

std::vector<char> configLabel(configLabelLength); 
fread(&configLabel[0], 1, configLabel.size(), baseFile_); 

Les éléments d'un vecteur sont contigus.


* Je suppose que vous savez que unsigned int n'est pas nécessaire toujours 4 octets. Si vous prêtez attention à vos détails de mise en œuvre, c'est bien, mais ce sera un peu plus facile si vous adoptez cstdint.hpp de Boost et utilisez simplement uint32_t.

+0

@Gman ... cette hypothèse est correcte. En raison du code existant et que d'autres utilisateurs moins qualifiés/expérimentés utiliseront ce code, je fais de mon mieux pour que le code reste lisible. J'aime vraiment boost et l'implémenter ailleurs, mais je suis hésitant à implémenter boost pour les variables. Notre ICD utilise spécifiquement le terme 'unsigned int', donc je veux essayer de faire correspondre l'ICD pour les autres utilisateurs. : p – Elpezmuerto

+0

Grand accord avec votre commentaire de 4 octets. Le fichier binaire et le code réseau doivent toujours utiliser des objets avec des tailles, des alignements et des ordres d'octets spécifiés. Forex, j'utilise une structure C++ nommée le_uint32_t pour faire fonctionner le code sur PowerPC avec des formats binaires Intel. –

Questions connexes