web-dev-qa-db-ja.com

C ++でファイルのサイズを取得するにはどうすればよいですか?

this one に対する補完的な質問を作成しましょう。 C++でファイルサイズを取得する最も一般的な方法は何ですか?答える前に、それが移植可能(Unix、MacおよびWindowsで実行可能)、信頼性が高く、理解しやすく、ライブラリの依存関係がないことを確認してください(ブーストやqtはありませんが、たとえばglibは移植可能なライブラリであるため大丈夫です)。

118
Sophie Sperner
#include <fstream>

std::ifstream::pos_type filesize(const char* filename)
{
    std::ifstream in(filename, std::ifstream::ate | std::ifstream::binary);
    return in.tellg(); 
}

C++のファイルの詳細については、 http://www.cplusplus.com/doc/tutorial/files/ を参照してください。

144
Spyros

必ずしも最も一般的な方法とは限りませんが、ftell、fseekの方法は、状況によっては必ずしも正確な結果が得られるとは限りません。具体的には、既に開いているファイルが使用され、そのサイズを処理する必要があり、たまたまテキストファイルとして開かれている場合、間違った答えが返されます。

StatはWindows、Mac、Linuxのcランタイムライブラリの一部であるため、次のメソッドは常に機能するはずです。

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もあります。したがって、非常に大きなファイルにこれが必要な場合は、それらの使用を検討することをお勧めします。

67
Matt

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";
}
23
bames53

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;
}
23
Andro
#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);
}
3
Sharon Joseph

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;
}
1
Hadi Rasekh

以下のコードスニペットは、この投稿の質問に正確に対応しています。

///
/// 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;
}
0
Sammy