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:19636parcourir

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();
}

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);

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!

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