Le pointeur de fin de fichier * n'est pas égal à la taille des données écrites

StackOverflow https://stackoverflow.com/questions/145006

  •  02-07-2019
  •  | 
  •  

Question

Très simplement, j'ai l'extrait de code suivant:

FILE* test = fopen("C:\\core.u", "w");
printf("Filepointer at: %d\n", ftell(test));
fwrite(data, size, 1, test);
printf("Written: %d bytes.\n", size);
fseek(test, 0, SEEK_END);
printf("Filepointer is now at %d.\n", ftell(test));
fclose(test);

et il génère:

Filepointer at: 0
Written: 73105 bytes.
Filepointer is now at 74160.

Pourquoi ça? Pourquoi le nombre d'octets écrits ne correspond-il pas au pointeur de fichier?

Était-ce utile?

La solution

Puisque vous ouvrez le fichier en mode texte, les marqueurs de fin de ligne, tels que LF, seront convertis en CR / LF.

C’est probable si vous utilisez Windows (et vous l’êtes probablement, étant donné que votre nom de fichier commence par & c; \: ").

Si vous ouvrez le fichier en mode "wb" , je suppose que vous trouverez les numéros identiques:

FILE* test = fopen("C:\\core.u", "wb");

La norme C99 dit ceci dans 7.19.5.3 La fonction fopen :

  

Le mode argument pointe sur une chaîne. Si la chaîne est l’un des suivants, le fichier est   ouvrir dans le mode indiqué. Sinon, le comportement n'est pas défini.

     

r fichier texte ouvert à lire
   w tronquer à zéro ou créer un fichier texte pour l'écriture
   a append; ouvrir ou créer un fichier texte pour l'écrire à la fin du fichier
   rb ouvrir un fichier binaire en lecture

   wb tronquer à une longueur nulle ou créer un fichier binaire pour l'écriture
   ab append; ouvrir ou créer un fichier binaire pour l'écriture en fin de fichier
   r + ouvrir le fichier texte pour la mise à jour (en lecture et en écriture)
   w + tronquer à zéro ou créer un fichier texte pour la mise à jour
   a + append; ouvrir ou créer un fichier texte pour la mise à jour, l'écriture en fin de fichier
   r + b ou rb + ouvrir un fichier binaire à mettre à jour (en lecture et en écriture)

   w + b ou wb + tronquer à une longueur nulle ou créer un fichier binaire pour la mise à jour
   a + b ou ab + append; ouvrir ou créer un fichier binaire pour la mise à jour, l'écriture en fin de fichier

Vous pouvez voir qu'ils font la distinction entre w et wb . Je ne crois pas qu'une implémentation soit requise pour traiter les deux différemment, mais il est généralement plus sûr d'utiliser le mode binaire pour les données binaires.

Autres conseils

que retourne fwrite? normalement, la valeur de retour doit être le nombre d'octets écrits. De plus, à quoi répond ftell () juste avant le fseek?

Il peut être utile de connaître le système d'exploitation, la version du compilateur C et la bibliothèque C.

Un pointeur de fichier est un cookie. Cela n'a aucune valeur. La seule chose que vous pouvez utiliser est de chercher au même endroit dans un fichier. Je ne suis même pas sûr que l'ISO C garantisse que ftell renvoie des valeurs croissantes. Si vous ne le croyez pas, veuillez regarder les différents modes seek (). Ils existent précisément parce que la position n’est pas un simple décalage d’octets.

windows n’écrit pas réellement toutes les données dans le fichier sans vidage ni éventuellement fsync. Peut-être que c'est pourquoi

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top