Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Menentukan Saiz Fail Dengan Tepat Menggunakan Fungsi `tellg()` C?

Bagaimanakah Saya Boleh Menentukan Saiz Fail Dengan Tepat Menggunakan Fungsi `tellg()` C?

Barbara Streisand
Barbara Streisandasal
2024-12-09 10:00:19637semak imbas

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

Tellg() Salah Tafsiran dalam Menganggar Saiz Fail

Fungsi tellg() dalam C direka untuk mengembalikan nilai token yang mewakili sesuatu kedudukan dalam fail. Nilai ini boleh digunakan untuk melompat kembali ke kedudukan itu kemudian menggunakan fungsi seekg(). Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa tellg() tidak memberikan saiz fail secara langsung dalam bait.

Dalam kod yang disediakan:

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

Panggilan ke fail.tellg() digunakan untuk menganggar saiz fail. Walau bagaimanapun, pendekatan ini tidak betul kerana tellg() tidak mengembalikan saiz fail secara langsung.

Pendekatan Betul untuk Menentukan Saiz Fail

Untuk menentukan saiz fail dengan tepat dalam bait, adalah disyorkan untuk menggunakan pendekatan 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);

Kod ini membaca fail sehingga tamat, dan fungsi gcount() mengembalikan bilangan bait yang dibaca. Nilai ini mewakili saiz sebenar fail.

Nota Tambahan

  • Penimbal pembolehubah harus diisytiharkan sebagai char** dan bukannya char* dengan betul tuding pada tatasusunan aksara.
  • Adalah dinasihatkan untuk menggunakan std::vector atau std::string dan bukannya memperuntukkan memori secara dinamik untuk memudahkan pengurusan memori dan mengelakkan kebocoran.
  • Keadaan gelung dalam gelung cetakan akhir hendaklah i < *saiz - 1 untuk memastikan cetakan yang betul sehingga penghujung penimbal.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menentukan Saiz Fail Dengan Tepat Menggunakan Fungsi `tellg()` 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