Let's create a complementary question to this one. What is the most common way to get the file size in C++? Before answering, make sure it is portable (may be executed on Unix, Mac and Windows), reliable, easy to understand and without library dependencies (no boost or qt, but for instance glib is ok since it is portable library).
#include <fstream>
std::ifstream::pos_type filesize(const char* filename)
{
std::ifstream in(filename, std::ifstream::ate | std::ifstream::binary);
return in.tellg();
}
See http://www.cplusplus.com/doc/tutorial/files/ for more information on files in C++.
edit: this answer is not correct since tellg() does not necessarily return the right value. See https://mcmap.net/q/56295/-tellg-function-give-wrong-size-of-file
std::ifstream::in
here? There is no input to the stream at all. –
Photon std::ifstream in(filename, std::ios::binary | std::ios::ate);
Just to ease everybody's life ;) –
Bumgardner O(1)
or O(n)
, n
being the size of file in bytes? –
Yokefellow C
stat()
? –
Daffie tellg()
returns a negative number –
Theatrician Using the C++ filesystem library:
#include <filesystem>
int main(int argc, char *argv[]) {
std::filesystem::path p{argv[1]};
std::cout << "The size of " << p.u8string() << " is " <<
std::filesystem::file_size(p) << " bytes.\n";
}
filesystem
is ISO C++ as of C++17 –
Hanahanae While not necessarily the most popular method, I've heard that the ftell, fseek method may not always give accurate results in some circumstances. Specifically, if an already opened file is used and the size needs to be worked out on that and it happens to be opened as a text file, then it's going to give out wrong answers.
The following methods should always work as stat is part of the c runtime library on Windows, Mac and Linux.
#include <sys/stat.h>
long GetFileSize(std::string filename)
{
struct stat stat_buf;
int rc = stat(filename.c_str(), &stat_buf);
return rc == 0 ? stat_buf.st_size : -1;
}
or
long FdGetFileSize(int fd)
{
struct stat stat_buf;
int rc = fstat(fd, &stat_buf);
return rc == 0 ? stat_buf.st_size : -1;
}
If you need this for very large files (>2GB) you may want to look at calling stat64
and fstat64
if available.
It is also possible to find that out using the fopen(),fseek() and ftell() function.
int get_file_size(std::string filename) // path to file
{
FILE *p_file = NULL;
p_file = fopen(filename.c_str(),"rb");
fseek(p_file,0,SEEK_END);
int size = ftell(p_file);
fclose(p_file);
return size;
}
<fstream>
and <iostream>
, you do need <string>
and you need error checking. (fseek
segfaults when using a NULL file, ftell returns -1 on error) –
Nedrud long
for the return type? –
Gertiegertrud #include <stdio.h>
int main()
{
FILE *f;
f = fopen("mainfinal.c" , "r");
fseek(f, 0, SEEK_END);
unsigned long len = (unsigned long)ftell(f);
printf("%ld\n", len);
fclose(f);
}
In c++ you can use following function, it will return the size of you file in bytes.
#include <fstream>
int fileSize(const char *add){
ifstream mySource;
mySource.open(add, ios_base::binary);
mySource.seekg(0,ios_base::end);
int size = mySource.tellg();
mySource.close();
return size;
}
cplusplus.com
for C++ reference, it's outdated beyond usability. Not only it lacks the newer stuff from C++14, C++17, C++20 and experimental TS, it also has some considerable errors in some articles. –
Fiddlededee The code snippet below exactly addresses the question in this post :)
///
/// Get me my file size in bytes (long long to support any file size supported by your OS.
///
long long Logger::getFileSize()
{
std::streampos fsize = 0;
std::ifstream myfile ("myfile.txt", ios::in); // File is of type const char*
fsize = myfile.tellg(); // The file pointer is currently at the beginning
myfile.seekg(0, ios::end); // Place the file pointer at the end of file
fsize = myfile.tellg() - fsize;
myfile.close();
static_assert(sizeof(fsize) >= sizeof(long long), "Oops.");
cout << "size is: " << fsize << " bytes.\n";
return fsize;
}
© 2022 - 2024 — McMap. All rights reserved.
fstat()
is standardized in POSIX, but Windows chose to deviate from that standard by calling the funciton_fstat()
.fstat()
is not portable, because you need an#ifdef _WIN32
to use it. – Checkered