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
Barbara Streisandoriginal
2024-12-09 10:00:19745parcourir

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 <p>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.</p><p><strong>Approche correcte pour déterminer la taille du fichier</strong></p><p>Pour déterminer avec précision la taille d'un fichier en octets, il est recommandé d'utiliser l'approche suivante :</p><pre class="brush:php;toolbar:false">#include <limits>

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

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

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!

Déclaration:
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