Home > Backend Development > C++ > How Can I Accurately Determine a File's Size Using C 's `tellg()` Function?

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

Barbara Streisand
Release: 2024-12-09 10:00:19
Original
636 people have browsed it

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

tellg() Misinterpretation in Estimating File Size

The tellg() function in C is designed to return a token value that represents a specific position within a file. This value can be used to jump back to that position later using the seekg() function. However, it's important to note that tellg() does not directly provide the size of a file in bytes.

In the code provided:

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

The call to file.tellg() is used to estimate the size of the file. However, this approach is incorrect as tellg() does not return the file size directly.

Correct Approach to Determine File Size

To accurately determine the size of a file in bytes, it's recommended to use the following approach:

#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);
Copy after login

This code reads the file until the end, and the gcount() function returns the number of bytes read. This value represents the actual size of the file.

Additional Notes

  • The variable buffer should be declared as a char** instead of char* to correctly point to a character array.
  • It's advisable to use a std::vector or std::string instead of dynamically allocating memory to simplify memory management and avoid leaks.
  • The loop condition in the final print loop should be i < *size - 1 to ensure proper printing up to the end of the buffer.

The above is the detailed content of How Can I Accurately Determine a File's Size Using C 's `tellg()` Function?. For more information, please follow other related articles on the PHP Chinese website!

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template