Hoe kan ik een bestandsgrootte krijgen in C++? [DUPLICEER]

Laten we een aanvullende vraag maken bij deze .
Wat is de meest gebruikelijke manier om de bestandsgrootte in C++ te krijgen?
Voordat u het beantwoordt, moet u ervoor zorgen dat deze draagbaar is (kan worden uitgevoerd op Unix, Mac en Windows),
Betrouwbaar, gemakkelijk te begrijpen en zonder bibliotheekafhankelijkheid (geen boost of qt, maar bijvoorbeeld GLIB is OK, omdat het draagbare bibliotheek is).


Antwoord 1, Autoriteit 100%

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

Zie http://www.cplusplus.com/doc/tutorial/files/Voor meer informatie over bestanden in C++.

EDIT: Dit antwoord is niet correct sinds Tellg () niet noodzakelijkerwijs de juiste waarde retourneert. Zie http://stackoverflow.com/a/22986486/1835769


Antwoord 2, Autoriteit 61%

Hoewel ik niet noodzakelijk de meest populaire methode heb gehoord, heb ik dat de FTell, FSeek-methode mogelijk niet altijd nauwkeurige resultaten oplevert in sommige omstandigheden. In het bijzonder, als een reeds geopend bestand wordt gebruikt en de grootte moet worden uitgewerkt en het gebeurt als een tekstbestand, dan gaat het verkeerde antwoorden geven.

De volgende methoden moeten altijd werken als stat deel uitmaken van de C-runtime-bibliotheek op Windows, Mac en 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;
}

Op sommige systemen is er ook een stat64/fstat64. Dus als je dit nodig hebt voor zeer grote bestanden, wil je misschien kijken om die te gebruiken.


Antwoord 3, autoriteit 40%

De C++ bestandssysteembibliotheek gebruiken:

#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";
}

Antwoord 4, autoriteit 17%

Het is ook mogelijk om dat uit te zoeken met de functies fopen(),fseek() en 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;
}

Antwoord 5, autoriteit 4%

#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);
}

Antwoord 6

In c++ kun je de volgende functie gebruiken, het zal de grootte van je bestand in bytes teruggeven.

#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;
}

Antwoord 7

Het onderstaande codefragment beantwoordt precies de vraag hierin
posten 🙂

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

Other episodes