Similaire à ceci . Mais que se passe-t-il si MAX_BOOKS est également inconnu?
Je veux obtenir le nombre de structures d'un fichier.
Ma structure:
void nacist_material() {
FILE* pSoubor;
MATERIAL materialy_pocitadlo;
int i;
int b;
if((pSoubor = fopen(SOUBOR_MATERIAL, "rb")) == NULL ) {
printf("\nChyba pÅi Ätenà souboru");
return;
}
pocet_zaznamu_materialu = 3;
printf("\n\n===>%d", pocet_zaznamu_materialu);
if(pocet_zaznamu_materialu > 0) {
printf("\nExistuje %d materialu", pocet_zaznamu_materialu);
free(pMaterialy);
pMaterialy = (MATERIAL *) malloc(pocet_zaznamu_materialu * sizeof(MATERIAL));
for(i = 0; i < pocet_zaznamu_materialu; i++) {
b = fread(&pMaterialy[i], sizeof(MATERIAL), 1, pSoubor);
}
printf("\n otrava %d", b);
}
else {
printf("\nNeexistuje pÅedchozà záznam materialu");
}
fclose(pSoubor);
return;
3 Réponses :
Si le fichier n'est composé que d'une liste de votre struct désirée stockée de manière contiguë, alors la taille du fichier, en octets, sera un multiple de la taille de votre structure, et vous pouvez obtenir la taille du fichier puis le nombre de structures dans le fichier comme ceci:
size_t len_file, num_structs; fseek(fp, 0, SEEK_END); len_file = ftell(fp); rewind(fp); num_structs = len_file/sizeof(MYSTRUCT);
L'utilisation de stat pourrait être plus facile
Merci pour la réponse rapide, je vais l'utiliser.
@EdHeal Je crois que stat et la famille ne sont pas des extensions C standard mais posix?
@GovindParmar Si vous vous inquiétez de la norme C, vous ne pouvez pas fseek () jusqu'à la fin d'un flux binaire. Par 7.21.9.2 La fonction fseek , paragraphe 3 : "... Un flux binaire n'a pas besoin de prendre en charge de manière significative les appels fseek avec une valeur whence de SEEK_END ." Selon note de bas de page 268 : "Définition de l'indicateur de position du fichier à la fin- of-file, comme avec fseek (file, 0, SEEK_END) , a un comportement indéfini pour un flux binaire ... "
Cela peut être un réel problème lorsque vous lisez depuis un fichier dynamique (un autre programme écrit à la fin du fichier pendant que vous le lisez), un tube ou une socket réseau. Dans ce cas, vous n'avez vraiment aucun moyen de deviner le nombre de structures.
Dans ce cas, un idiome courant est d'utiliser un tableau alloué dynamiquement de structures de taille arbitraire, puis de le faire croître avec realloc chaque fois que le tableau actuellement alloué est plein. Vous pouvez par exemple faire en sorte que la nouvelle taille soit deux fois la précédente.
C'est ainsi que les vecteurs C ++ gèrent leur tableau sous-jacent sous le capot.
Avez-vous envisagé d'ajouter un en-tête au fichier?
Autrement dit, placez une structure spéciale au début du fichier qui vous donne des informations sur le fichier. Quelque chose comme ...
struct file_header {
char id[32]; /* Let this contain a special identifying string */
uint32_t version; /* version number in case the file structure changes */
uint32_t num_material; /* number of material structures in file */
};
Non seulement cela vous donne un moyen relativement rapide de déterminer le nombre de structures matérielles que vous avez dans votre fichier, mais il est également extensible. Vous voudrez peut-être stocker d'autres structures dans ce fichier, et vous voulez savoir combien de chacune d'entre elles s'y trouvent - ajoutez simplement un nouveau champ et mettez à jour la version.
Si vous le souhaitez, vous pouvez même lancez une vérification des erreurs.
Comment comptez-vous le nombre de tasses d'eau dans un seau, étant donné que tout ce que vous savez est le nombre d'onces liquides dans le seau et le nombre d'onces liquides dans une tasse?
@Eugene Sh.
MAX_BOOKSest-ce ce code .