Heim >Backend-Entwicklung >C++ >Wie kann ich die Größe einer Datei mit der Funktion „tellg()' von C genau bestimmen?

Wie kann ich die Größe einer Datei mit der Funktion „tellg()' von C genau bestimmen?

Barbara Streisand
Barbara StreisandOriginal
2024-12-09 10:00:19632Durchsuche

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

tellg()-Fehlinterpretation bei der Schätzung der Dateigröße

Die tellg()-Funktion in C ist so konzipiert, dass sie einen Tokenwert zurückgibt, der einen bestimmten Wert darstellt Position innerhalb einer Datei. Dieser Wert kann verwendet werden, um später mit der Funktion seeng() zu dieser Position zurückzukehren. Es ist jedoch wichtig zu beachten, dass tellg() nicht direkt die Größe einer Datei in Bytes bereitstellt.

Im bereitgestellten Code:

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

Der Aufruf von file.tellg() wird verwendet, um die Größe der Datei abzuschätzen. Dieser Ansatz ist jedoch falsch, da tellg() die Dateigröße nicht direkt zurückgibt.

Richtiger Ansatz zur Bestimmung der Dateigröße

Um die Größe einer Datei genau zu bestimmen in Bytes wird empfohlen, den folgenden Ansatz zu verwenden:

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

Dieser Code liest die Datei bis zum Ende und die Funktion gcount() gibt die Datei zurück Anzahl der gelesenen Bytes. Dieser Wert stellt die tatsächliche Größe der Datei dar.

Zusätzliche Hinweise

  • Der Variablenpuffer sollte zur korrekten Darstellung als char** statt als char* deklariert werden Zeigen Sie auf ein Zeichenarray.
  • Es ist ratsam, ein std::vector zu verwenden. oder std::string, anstatt Speicher dynamisch zuzuweisen, um die Speicherverwaltung zu vereinfachen und Lecks zu vermeiden.
  • Die Schleifenbedingung in der letzten Druckschleife sollte i < sein. *Größe - 1, um ein ordnungsgemäßes Drucken bis zum Ende des Puffers sicherzustellen.

Das obige ist der detaillierte Inhalt vonWie kann ich die Größe einer Datei mit der Funktion „tellg()' von C genau bestimmen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn