Frage

Ich brauche die Byte-Größe einer Datei determin.

Die Codierung Sprache ist C ++ und der Code sollte mit Linux, Windows und anderen Betriebssystemen arbeiten. Dies bedeutet, unter Verwendung von Standard-C oder C ++ Funktionen / Klassen.

Diese trivial Notwendigkeit hat anscheinend keine triviale Lösung.

War es hilfreich?

Lösung

Mit std Stream können Sie:

std::ifstream ifile(....);
ifile.seekg(0, std::ios_base::end);//seek to end
//now get current position as length of file
ifile.tellg();

Wenn Sie mit Schreib behandeln nur Datei (std :: ofstream), dann Methoden sind einige andere:

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

Andere Tipps

Sie können stat Systemaufruf verwendet werden:

#ifdef WIN32 
_stat64()
#else
stat64()

Wenn Sie nur die Dateigröße dies sicherlich übertrieben, aber im Allgemeinen würde ich mit Boost.Filesystem für plattformunabhängige Dateioperationen. Unter anderem Attribute Funktionen enthält es

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

Sie können die Referenz hier . Obwohl Boost-Bibliotheken können riesige scheinen fand ich es oft, die Dinge umzusetzen sehr effizient. Sie könnten auch nur die Funktion extrahieren Sie brauchen, aber dies könnte Beweis schwierig, wie Boost-recht komplex ist.

Simples:

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

Oft wollen wir die Dinge in der meisten tragbaren Weise getan, aber in bestimmten Situationen, vor allem wie diese, würde ich stark mit System-APIs für die beste Leistung empfehlen.

Portabilität erfordert, dass Sie den kleinsten gemeinsamen Nenner zu verwenden, die C wäre (nicht c ++) Die Methode, die ich benutze, ist die folgende.

#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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top