Позвольте создать дополнительный вопрос этого. Каков наиболее распространенный способ получить размер файла на С++? Прежде чем отвечать, убедитесь, что он переносимый (может выполняться в Unix, Mac и Windows), надежный, простой в понимании и без зависимостей между библиотеками (без boost или qt, но, например, glib в порядке, поскольку это портативная библиотека).
Как получить размер файла в С++?
Ответ 1
#include <fstream>
std::ifstream::pos_type filesize(const char* filename)
{
std::ifstream in(filename, std::ifstream::ate | std::ifstream::binary);
return in.tellg();
}
Подробнее о файлах на С++ см. http://www.cplusplus.com/doc/tutorial/files/.
Ответ 2
Хотя это и не самый популярный метод, я слышал, что метод ftell, fseek не всегда дает точные результаты при некоторых обстоятельствах. В частности, если используется уже открытый файл, и размер должен быть отработан на этом, и он, как представляется, открывается в виде текстового файла, тогда он собирается выдавать неправильные ответы.
Следующие методы должны всегда работать, поскольку stat является частью библиотеки времени c в Windows, Mac и Linux.
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;
}
В некоторых системах также есть stat64/fstat64. Поэтому, если вам нужно это для очень больших файлов, вы можете захотеть использовать их.
Ответ 3
Также можно найти это с помощью функций fopen(), fseek() и ftell().
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;
}
Ответ 4
Использование файловой системы С++ TS:
#include <experimental/filesystem>
namespace fs = std::experimental::filesystem;
int main(int argc, char *argv[]) {
fs::path p{argv[1]};
p = fs::canonical(p);
std::cout << "The size of " << p.u8string() << " is " <<
fs::file_size(p) << " bytes.\n";
}
Ответ 5
#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);
}
Ответ 6
В С++ вы можете использовать следующую функцию, она вернет размер вашего файла в байтах.
#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;
}
Ответ 7
Фрагмент кода ниже точно задает вопрос в этом сообщение:)
///
/// 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;
}