Heim >Backend-Entwicklung >C++ >Warum meldet tellg() inkonsistente Dateigrößen und wie kann ich die Dateigröße genau bestimmen?

Warum meldet tellg() inkonsistente Dateigrößen und wie kann ich die Dateigröße genau bestimmen?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-08 03:54:11139Durchsuche

Why Does tellg() Report Inconsistent File Sizes, and How Can I Accurately Determine File Size?

tellg()-Funktion meldet inkonsistente Dateigröße

Beim Versuch, eine Datei in einen Puffer einzulesen, können Benutzer bei der Verwendung auf falsche Ergebnisse stoßen die tellg()-Funktion. Entgegen den Erwartungen meldet tellg() einen Token-Wert anstelle der tatsächlichen Dateigröße oder des Byte-Offsets. Diese Diskrepanz kann auf den beabsichtigten Zweck der Funktion zurückgeführt werden.

Technisch gesehen gibt tellg() nicht direkt die Dateigröße oder ihre genaue Position in Bytes an. Vielmehr stellt es ein Token bereit, das es dem Programm ermöglicht, denselben Speicherort in der Datei erneut aufzurufen. Es kann nicht garantiert werden, dass der Wert des Tokens in einen integralen Datentyp konvertierbar ist.

In Unix-basierten Systemen stellt tellg() im Allgemeinen den Byte-Offset vom Dateianfang dar. Auf Windows-Systemen unterscheidet sich das Verhalten jedoch je nach Öffnungsmodus der Datei. Bei Binärdateien ähnelt der Offset dem Unix-Verhalten. Im Textmodus gibt es jedoch keinen direkten Zusammenhang zwischen der Ausgabe von tellg() und der tatsächlichen Anzahl an Bytes, die zum Erreichen einer bestimmten Position erforderlich sind.

Um die Anzahl der lesbaren Bytes in einer Datei genau zu bestimmen, muss die Der zuverlässigste Ansatz besteht darin, den Lesevorgang auszuprobieren. Dies kann mit den folgenden Schritten erreicht werden:

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

Hier wird Ignorieren verwendet, um bis zum Ende der Datei zu lesen. Der Wert von gcount() liefert dann die tatsächliche Anzahl an Bytes.

Zusätzliche Hinweise:

  1. Die Zeile *buffer = new char[length]; sollte vermieden werden, da es versucht, einen Zeiger auf eine Zeichenvariable zuzuweisen. Erwägen Sie stattdessen, den Puffer als char** zu deklarieren oder einen Vektor oder String zu verwenden.
  2. Die Schleifenbedingung am Ende des Codes für (int i = 0; i < size; i ) sollte in geändert werden Berücksichtigen Sie mögliche Probleme beim Lesen.
  3. Es besteht die Möglichkeit, dass Fehler beim Öffnen von Dateien nicht behandelt werden (z. B. indem die Größe auf 0 gesetzt wird). Aufsicht.

Das obige ist der detaillierte Inhalt vonWarum meldet tellg() inkonsistente Dateigrößen und wie kann ich die Dateigröße 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