Maison > développement back-end > C++ > Pourquoi `tellg()` ne rapporte-t-il pas avec précision la taille du fichier en C ?

Pourquoi `tellg()` ne rapporte-t-il pas avec précision la taille du fichier en C ?

Barbara Streisand
Libérer: 2024-12-02 20:56:11
original
181 Les gens l'ont consulté

Why Does `tellg()` Not Accurately Report File Size in C  ?

Idée fausse tellg() : rapporter la taille du fichier

Dans votre extrait de code, vous avez rencontré un problème où la fonction tellg() renvoyait une valeur plus grand que la taille réelle du fichier lu par la fonction read(). Cette divergence perçue résulte d'une mauvaise compréhension du but de tellg().

Fonction de Tellg

Contrairement à la croyance populaire, tellg() ne fournit pas la taille du fichier ou le décalage depuis le début en octets. Au lieu de cela, il renvoie une valeur de jeton, un espace réservé qui peut être utilisé ultérieurement pour revenir à la même position dans le fichier. Le nombre réel renvoyé peut varier en fonction du système d'exploitation et du mode de fichier.

Implémentations pratiques

En pratique, sur les systèmes Unix, tellg() renvoie le décalage en octets , tandis que sous Windows, il renvoie le décalage uniquement pour les fichiers ouverts en mode binaire. Pour le mode texte sous Windows, la valeur renvoyée peut ne pas refléter avec précision le nombre d'octets requis pour atteindre cette position.

Comptage précis des octets

Pour déterminer avec précision le nombre de octets pouvant être lus, la seule méthode fiable consiste à effectuer une opération de lecture. Ceci peut être réalisé en utilisant une technique comme la suivante :

#include <limits>

file.ignore( std::numeric_limits<std::streamsize>::max() );
std::streamsize length = file.gcount();
file.clear();   //  Since ignore will have set eof.
file.seekg( 0, std::ios_base::beg );
Copier après la connexion

Autres observations

Outre le problème tellg(), votre code contient des erreurs supplémentaires :

  1. La ligne "buffer = new char[length];" devrait être "*buffer = new char[length];" pour allouer un pointeur vers un tableau de caractères.
  2. La condition de boucle dans la deuxième boucle for doit être while ( file.get( buffer[i] ) ) pour une lecture caractère par caractère.
  3. La gestion des erreurs doit être mise en œuvre en cas d'échec de l'ouverture du fichier.

En résolvant ces problèmes, votre code peut déterminer avec précision la taille du fichier. et effectuez les opérations de lecture comme prévu.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal