Rumah >pembangunan bahagian belakang >C++ >Mengapakah `tellg()` Tidak Melaporkan Saiz Fail dengan Tepat dalam C ?

Mengapakah `tellg()` Tidak Melaporkan Saiz Fail dengan Tepat dalam C ?

Barbara Streisand
Barbara Streisandasal
2024-12-02 20:56:11123semak imbas

Why Does `tellg()` Not Accurately Report File Size in C  ?

Salah Tanggapan Tellg(): Melaporkan Saiz Fail

Dalam coretan kod anda, anda menghadapi masalah apabila fungsi tellg() mengembalikan nilai lebih besar daripada saiz sebenar fail yang dibaca oleh fungsi read(). Percanggahan yang dirasakan ini timbul daripada salah faham tujuan tellg().

Fungsi Tellg

Bertentangan dengan kepercayaan popular, tellg() tidak memberikan saiz fail atau offset dari awal dalam bait. Sebaliknya, ia mengembalikan nilai token, pemegang tempat yang boleh digunakan kemudian untuk kembali ke kedudukan yang sama dalam fail. Nombor sebenar yang dikembalikan boleh berbeza-beza bergantung pada sistem pengendalian dan mod fail.

Pelaksanaan Praktikal

Dalam amalan, pada sistem Unix, tellg() mengembalikan offset dalam bait , manakala pada Windows, ia mengembalikan offset hanya untuk fail yang dibuka dalam mod binari. Untuk mod teks pada Windows, nilai yang dikembalikan mungkin tidak menggambarkan dengan tepat bilangan bait yang diperlukan untuk mencapai kedudukan tersebut.

Pengiraan Bait Tepat

Untuk menentukan bilangan bait dengan tepat bait yang boleh dibaca, satu-satunya kaedah yang boleh dipercayai ialah melakukan operasi baca. Ini boleh dicapai menggunakan teknik seperti berikut:

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

Pemerhatian Lain

Selain isu tellg(), kod anda mengandungi ralat tambahan:

  1. Barisan "penampan = aksara baharu[panjang];" hendaklah "*buffer = new char[length];" untuk memperuntukkan penuding kepada tatasusunan aksara.
  2. Keadaan gelung dalam kedua untuk gelung hendaklah semasa ( file.get( penimbal[i] ) ) untuk bacaan aksara demi aksara.
  3. Pengendalian ralat harus dilaksanakan sekiranya pembukaan fail gagal.

Dengan menangani isu ini, kod anda boleh menentukan saiz fail dengan tepat fail dan lakukan operasi baca seperti yang dimaksudkan.

Atas ialah kandungan terperinci Mengapakah `tellg()` Tidak Melaporkan Saiz Fail dengan Tepat dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn