Maison > développement back-end > C++ > Comment puis-je déterminer avec précision la taille d'un fichier à l'aide de la fonction `tellg()` de C ?

Comment puis-je déterminer avec précision la taille d'un fichier à l'aide de la fonction `tellg()` de C ?

Barbara Streisand
Libérer: 2024-12-09 10:00:19
original
642 Les gens l'ont consulté

How Can I Accurately Determine a File's Size Using C  's `tellg()` Function?

interprétation erronée de tellg() dans l'estimation de la taille du fichier

La fonction tellg() en C est conçue pour renvoyer une valeur de jeton qui représente un position dans un fichier. Cette valeur peut être utilisée pour revenir ultérieurement à cette position à l'aide de la fonction seekg(). Cependant, il est important de noter que tellg() ne fournit pas directement la taille d'un fichier en octets.

Dans le code fourni :

void read_file(const char* name, int *size, char*& buffer) {
  ifstream file;

  file.open(name, ios::in | ios::binary);
  *size = 0;
  if (file.is_open()) {
    // Get length of file
    file.seekg(0, std::ios_base::end);
    int length = *size = file.tellg();
    file.seekg(0, std::ios_base::beg);

    // Allocate buffer in size of file
    buffer = new char[length];

    // Read
    file.read(buffer, length);
    cout << file.gcount() << endl;
  }
  file.close();
}
Copier après la connexion

L'appel à file.tellg() est utilisé pour estimer la taille du fichier. Cependant, cette approche est incorrecte car tellg() ne renvoie pas directement la taille du fichier.

Approche correcte pour déterminer la taille du fichier

Pour déterminer avec précision la taille d'un fichier en octets, il est recommandé d'utiliser l'approche 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

Ce code lit le fichier jusqu'à la fin, et la fonction gcount() renvoie le nombre d'octets lire. Cette valeur représente la taille réelle du fichier.

Notes supplémentaires

  • Le tampon variable doit être déclaré comme un char** au lieu de char* pour correctement pointez vers un tableau de caractères.
  • Il est conseillé d'utiliser un std::vector ou std::string au lieu d'allouer dynamiquement de la mémoire pour simplifier la gestion de la mémoire et éviter les fuites.
  • La condition de boucle dans la boucle d'impression finale doit être i < *taille - 1 pour garantir une impression correcte jusqu'à la fin du tampon.

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