Question

J'écris une bibliothèque C qui lit un fichier en mémoire. Il saute les 54 premiers octets du fichier (en-tête) puis lit le reste sous forme de données. J'utilise fseek pour déterminer la longueur du fichier, puis fread pour le lire.

La boucle s'exécute une fois puis se termine car l'EOF est atteint (aucune erreur). A la fin, bytesRead = 10624, ftell (stream) = 28726 et le tampon contient 28726 valeurs. Je m'attends à ce que fread lise 30 000 octets et que la position du fichier soit 30054 lorsque EOF est atteint.

C n’est pas ma langue maternelle, je suppose que j’ai une erreur stupide de débutant quelque part.

Le code est le suivant:

const size_t headerLen = 54;

FILE * stream;
errno_t ferrno = fopen_s( &stream, filename.c_str(), "r" );
if(ferrno!=0) {
  return -1;
}

fseek( stream, 0L, SEEK_END );
size_t bytesTotal = (size_t)(ftell( stream )) - headerLen; //number of data bytes to read
size_t bytesRead = 0;
BYTE* localBuffer = new BYTE[bytesTotal];
fseek(stream,headerLen,SEEK_SET);
while(!feof(stream) && !ferror(stream)) {
    size_t result = fread(localBuffer+bytesRead,sizeof(BYTE),bytesTotal-bytesRead,stream);
    bytesRead+=result;
}

En fonction de la référence que vous utilisez, il est évident que l'ajout d'un " b " à l'indicateur de mode est la réponse. Recherche de nominations pour le badge bonehead. : -)

Cette référence en parle dans le deuxième paragraphe, deuxième phrase (mais pas dans leur table).

MSDN ne discute pas du binaire drapeau jusqu'à la moitié de la page.

L'OpenGroup mentionne l'existence de la " b " balise, mais indique qu'elle "n'aura aucun effet".

Était-ce utile?

La solution

c'est peut-être un problème de mode binaire. Essayez d’ouvrir le fichier avec le mode "r + b" .

MODIFIER : comme indiqué dans un commentaire, "rb" correspond probablement mieux à votre intention initiale, car "r + b " l'ouvrira en lecture / écriture et "rb" est en lecture seule.

Autres conseils

Il convient également de noter que le simple fait d'inclure binmode.obj dans votre commande de lien le fera pour vous lors de l'ouverture de tous les fichiers.

Une solution, basée sur les réponses précédentes:

    size_t bytesRead = 0;
    BYTE* localBuffer = new BYTE[bytesTotal];
    fseek(stream,headerLen,SEEK_SET);
        while(!feof(stream) && !ferror(stream)) {
        size_t result = fread(localBuffer+bytesRead,sizeof(BYTE),bytesTotal-
        bytesRead,stream);
    bytesRead+=result;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top