2009-08-14 5 views
2

Si je cours:C++ fread changement fgetpos étrangement

FILE* pFile = fopen("c:\\08.bin", "r"); 
fpos_t pos; 
char buf[5000]; 

int ret = fread(&buf, 1, 9, pFile); 
fgetpos(pFile, &pos); 

je reçois ret = 9 et pos = 9.

Cependant, si je cours

FILE* pFile = fopen("c:\\08.bin", "r"); 
fpos_t pos; 
char buf[5000]; 

int ret = fread(&buf, 1, 10, pFile); 
fgetpos(pFile, &pos); 

ret = 10 comme prévu, mais pos = 11!

Comment cela peut-il être?

Répondre

8

Vous devez ouvrir le fichier en mode binaire:

FILE * pFile = fopen("c:\\08.bin", "rb"); 

La différence est causée par la lecture d'un caractère que la bibliothèque pense est une nouvelle ligne et l'étendre - mode binaire empêche l'expansion.

+2

Comme indiqué dans la norme C: "Les valeurs stockées [par fgetpos()] contiennent des informations non spécifiées utilisables par la fonction fsetpos pour repositionnant le flux à sa position au moment de l'appel à la fonction fgetpos." –

+0

Aussi bien un exemple de standard que j'ai jamais lu! –

1

C'est une chose Windows. En mode texte Windows étend '\ n' à 'CR''LF' sur les écritures, et comprime 'CR''LF' à '\ n' sur les lectures. Le mode texte est le mode par défaut sur Windows. Comme le mentionne Neil, ajouter 'b' dans la chaîne de mode de fopen() désactive les nouvelles translations. Vous n'avez pas cette traduction sur * nix systems.

Questions connexes