Как я могу получить размер файла в C++? [дубликат]
этот вопрос уже есть ответ здесь:
- функция tellg () дает неправильный размер файла? 3 ответы
давайте создадим дополнительный вопрос к этому. Какой самый простой способ получить размер файла в C++? Прежде чем ответить, убедитесь, что он переносится (может быть выполнен на Unix, Mac и Windows), надежный, легкий для того чтобы понять и без библиотечных зависимостей (нет boost или qt, но, например, glib в порядке, так как это портативная библиотека).
7 ответов:
#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/ для получения дополнительной информации о файлах в C++.
хотя это не обязательно самый популярный метод, я слышал, что метод 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. Поэтому, если вам это нужно для очень больших файлов, вы можете посмотреть на их использование.
это также можно узнать, используя функцию 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; }
использование файловой системы C++ 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"; }
#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); }
В C++ вы можете использовать следующую функцию, она возвращает размер файла в байтах.
#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; }
приведенный ниже фрагмент кода точно отвечает на вопрос в этом 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; }