Rumah >pembangunan bahagian belakang >C++ >Mengapa tellg() Melaporkan Saiz Fail Tidak Konsisten, dan Bagaimana Saya Boleh Menentukan Saiz Fail Dengan Tepat?

Mengapa tellg() Melaporkan Saiz Fail Tidak Konsisten, dan Bagaimana Saya Boleh Menentukan Saiz Fail Dengan Tepat?

Patricia Arquette
Patricia Arquetteasal
2024-12-08 03:54:11139semak imbas

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

tellg() Pelaporan Fungsi Saiz Fail Tidak Konsisten

Dalam percubaan untuk membaca fail ke dalam penimbal, pengguna mungkin menghadapi keputusan yang salah apabila menggunakan fungsi tellg(). Tidak seperti jangkaan, tellg() melaporkan nilai token dan bukannya saiz fail sebenar atau ofset bait. Percanggahan ini boleh dikaitkan dengan tujuan fungsi yang dimaksudkan.

Secara teknikal, tellg() tidak secara langsung menunjukkan saiz fail atau kedudukan tepatnya dalam bait. Sebaliknya, ia menyediakan token yang membolehkan program untuk melawat semula lokasi yang sama dalam fail. Nilai token tidak dijamin boleh ditukar kepada jenis data integral.

Dalam sistem berasaskan Unix, tellg() secara amnya mewakili ofset bait dari permulaan fail. Pada sistem Windows, bagaimanapun, tingkah lakunya berbeza berdasarkan mod terbuka fail. Untuk fail binari, offset menyerupai tingkah laku Unix. Walau bagaimanapun, dalam mod teks, tiada korelasi langsung antara output tellg() dan bilangan bait sebenar yang diperlukan untuk mencapai kedudukan tertentu.

Untuk menentukan dengan tepat bilangan bait yang boleh dibaca dalam fail, pendekatan yang paling boleh dipercayai ialah mencuba proses membaca. Ini boleh dicapai menggunakan langkah berikut:

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

Di sini, abaikan digunakan untuk membaca sehingga akhir fail. Nilai gcount() kemudiannya memberikan bilangan bait sebenar.

Nota Tambahan:

  1. Baris *buffer = new char[length]; harus dielakkan kerana ia cuba memberikan penunjuk kepada pembolehubah aksara. Sebaliknya, pertimbangkan untuk mengisytiharkan penimbal sebagai aksara** atau menggunakan vektor atau rentetan.
  2. Keadaan gelung pada penghujung kod untuk (int i = 0; i < size; i ) hendaklah disemak kepada kira isu yang mungkin berlaku semasa membaca.
  3. Gagal menangani ralat pembukaan fail (cth., dengan menetapkan saiz kepada 0) adalah berpotensi kelalaian.

Atas ialah kandungan terperinci Mengapa tellg() Melaporkan Saiz Fail Tidak Konsisten, dan Bagaimana Saya Boleh Menentukan Saiz Fail Dengan Tepat?. 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