9
votes

Portable moyen pour obtenir la taille du fichier dans C / C ++

Je dois determin la taille en octets d'un fichier.

Le langage de codage est C ++ et le code devrait fonctionner avec Linux, Windows et tout autre système d'exploitation. Cela implique l'utilisation C standard ou des fonctions / classes de C.

Ce besoin trivial n'a apparemment pas de solution triviale.


6 Réponses :


10
votes

En utilisant le flux de std vous pouvez utiliser:

ofile.seekp(0, std::ios_base::end);
ofile.tellp();


7 commentaires

Ouvrez le fichier en binaire ou vous pourriez obtenir le mauvais résultat. ifstreams texte pourrait faire \ r \ n \ n traduction par exemple.


Le problème est que tellg () retourne une valeur de streampos de type. Il est généralement un int, mais il peut aussi être un autre type. Bien que je vais le garder comme une réponse.


Ma réponse reflète en fait ce fait parce que ma première itération était du haut de ma tête jusqu'à ce que quelqu'un a fait remarquer l'erreur et m'a marqué vers le bas pour elle.


N'est pas un ifstream inefficace si vous voulez juste pour obtenir la taille du fichier? stat () le fera sans avoir à ouvrir et chercher.


-1: fichier d'ouverture est mauvaise idée. De plus, vous ne pouvez pas vérifier la taille, par exemple, / etc / shadow de cette façon.


Pour améliorer un peu sur cette méthode, si vous recherchez une taille de fichier juste après l'ouverture, vous pouvez également faire: STD :: ifstream ifile (..., std :: ios_base :: a mangé); Il mettra le curseur directement à la fin du fichier et vous gagnez 1 ligne de code :)


Fichier pourrait être échoué à ouvrir. -1



0
votes

Simples:

std::ifstream ifs; 
ifs.open("mybigfile.txt", std::ios::bin); 
ifs.seekg(0, std::ios::end); 
std::fpos pos = ifs.tellg();


2 commentaires

Sur les systèmes 32 bits, Taille_T est de 32 bits. Cela échoue donc avec des fichiers de 4 Go ou plus.


J'ai écrit ce le brassard de sans référence. En regardant mon code il y a quelques problèmes que j'ai corrigé.



2
votes

Si vous avez seulement besoin de la taille du fichier est certainement ce matraquage, mais en général, je voudrais aller avec Boost.Filesystem pour les opérations de fichiers plate-forme indépendante. Parmi les autres fonctions d'attributs qu'il contient

template <class Path> uintmax_t file_size(const Path& p);


2 commentaires

Pourquoi booster quand il y a déjà de nombreuses façons de le faire facilement sans booster?


Les chances sont que si vous travaillez avec des fichiers, vous aurez peut-être besoin de plus de fonctionnalités de fichier: Boost est un bon choix pour cela - le corps standard accepte et ajoutera une bibliothèque basée sur Boost à STL. Si vous n'avez vraiment besoin que de la taille du fichier - par tous les moyens, utilisez @Dewfy Réponse



6
votes

Vous pouvez utiliser Stat System Call: XXX


1 commentaires

Il convient de noter que STAT La famille des fonctions fait partie de POSIX, de sorte qu'ils travaillent également sur des systèmes UNIX et UNIX.



-1
votes

Souvent, nous voulons que les choses soient faites de manière la plus portable, mais dans certaines situations, surtout comme celle-ci, je recommanderais vivement à l'aide de la meilleure performance des API système.


0 commentaires

-1
votes

La portabilité nécessite que vous utilisiez les dénominateurs les moins courants, ce qui serait C. (pas C ++) La méthode que j'utilise est la suivante.

#include <stdio.h>

long filesize(const char *filename)
{
FILE *f = fopen(filename,"rb");  /* open the file in read only */

long size = 0;
  if (fseek(f,0,SEEK_END)==0) /* seek was successful */
      size = ftell(f);
  fclose(f);
  return size;
}


2 commentaires

Dommage si vous avez un fichier> 2 Go de taille sur les plates-formes avec 32 bits de long int


@DavidHeffernan Il y a des versions de 64 bits de ces fonctions. Mais de côté, cela nécessite que vous puissiez ouvrir le fichier et que beaucoup plus lentement.