Maison > développement back-end > C++ > Pourquoi tellg() signale-t-il des tailles de fichiers incohérentes et comment puis-je déterminer avec précision la taille des fichiers ?

Pourquoi tellg() signale-t-il des tailles de fichiers incohérentes et comment puis-je déterminer avec précision la taille des fichiers ?

Patricia Arquette
Libérer: 2024-12-08 03:54:11
original
140 Les gens l'ont consulté

Why Does tellg() Report Inconsistent File Sizes, and How Can I Accurately Determine File Size?

Fonction tellg() signalant une taille de fichier incohérente

Lors d'une tentative de lecture d'un fichier dans un tampon, les utilisateurs peuvent rencontrer des résultats incorrects lors de l'utilisation la fonction tellg(). Contrairement aux attentes, tellg() rapporte une valeur de jeton au lieu de la taille réelle du fichier ou du décalage d'octets. Cet écart peut être attribué à l'objectif prévu de la fonction.

Techniquement, tellg() n'indique pas directement la taille du fichier ou sa position précise en octets. Au lieu de cela, il fournit un jeton qui permet au programme de revisiter le même emplacement dans le fichier. Il n'est pas garanti que la valeur du jeton soit convertible en un type de données intégral.

Dans les systèmes basés sur Unix, tellg() représente généralement le décalage d'octets depuis le début du fichier. Sur les systèmes Windows, cependant, son comportement diffère en fonction du mode d'ouverture du fichier. Pour les fichiers binaires, le décalage ressemble au comportement Unix. Cependant, en mode texte, il n'y a pas de corrélation directe entre la sortie de tellg() et le nombre réel d'octets requis pour atteindre une position donnée.

Pour déterminer avec précision le nombre d'octets lisibles dans un fichier, le L’approche la plus fiable consiste à tenter le processus de lecture. Ceci peut être réalisé en suivant les étapes suivantes :

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

Ici, ignorer est utilisé pour lire jusqu'à la fin du fichier. La valeur de gcount() fournit alors le nombre réel d'octets.

Notes supplémentaires :

  1. La ligne *buffer = new char[length]; doit être évité car il tente d'attribuer un pointeur à une variable de caractère. Envisagez plutôt de déclarer le tampon en tant que char** ou d'utiliser un vecteur ou une chaîne.
  2. La condition de boucle à la fin du code pour (int i = 0; i < size; i ) doit être révisée en tenir compte des problèmes potentiels lors de la lecture.
  3. Ne pas gérer les erreurs d'ouverture de fichier (par exemple, en définissant la taille sur 0) est un oubli potentiel.

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