Utilizzando filestreams C ++ (fstream), come è possibile determinare la dimensione di un file? [duplicare]

StackOverflow https://stackoverflow.com/questions/2409504

  •  18-09-2019
  •  | 
  •  

Domanda

    

Questa domanda ha già una risposta qui:

         

Sono sicuro che ho appena perso questo nel manuale, ma come si fa a determinare la dimensione di un file (in byte) utilizzando la classe istream C ++ s 'dalla testata fstream?

È stato utile?

Soluzione

È possibile aprire il file utilizzando il flag ios::ate (e bandiera ios::binary), quindi la funzione tellg() vi darà direttamente la dimensione del file:

ifstream file( "example.txt", ios::binary | ios::ate);
return file.tellg();

Altri suggerimenti

Si può cercare fino alla fine, poi calcolare la differenza:

std::streampos fileSize( const char* filePath ){

    std::streampos fsize = 0;
    std::ifstream file( filePath, std::ios::binary );

    fsize = file.tellg();
    file.seekg( 0, std::ios::end );
    fsize = file.tellg() - fsize;
    file.close();

    return fsize;
}

Non utilizzare tellg per determinare l'esatta dimensione del file. La lunghezza determinata da tellg sarà più grande il numero di caratteri possono essere letti dal file.

Da funzione StackOverflow questione tellg () danno taglia sbagliata di lima? tellg non riporta le dimensioni del file, né l'offset dall'inizio in byte. Si riporta un valore simbolico, che può essere utilizzato successivamente per cercare nello stesso posto, e niente di più. (Non è nemmeno garantito che è possibile convertire il tipo di un tipo integrale.). Per Windows (e la maggior parte dei sistemi non-Unix), in modalità testo, non v'è alcuna mappatura diretta e immediata tra ciò che tellg rendimenti e il numero di byte è necessario leggere per arrivare a quella posizione.

Se è importante sapere esattamente quanti byte si può leggere, l'unico modo di fare in modo affidabile così è leggendo. Si dovrebbe essere in grado di fare questo con qualcosa di simile:

#include <fstream>
#include <limits>

ifstream file;
file.open(name,std::ios::in|std::ios::binary);
file.ignore( std::numeric_limits<std::streamsize>::max() );
std::streamsize length = file.gcount();
file.clear();   //  Since ignore will have set eof.
file.seekg( 0, std::ios_base::beg );

In questo modo:

long begin, end;
ifstream myfile ("example.txt");
begin = myfile.tellg();
myfile.seekg (0, ios::end);
end = myfile.tellg();
myfile.close();
cout << "size: " << (end-begin) << " bytes." << endl;

Sono un novizio, ma questo è il mio autodidatta modo di fare:

ifstream input_file("example.txt", ios::in | ios::binary)

streambuf* buf_ptr =  input_file.rdbuf(); //pointer to the stream buffer

input.get(); //extract one char from the stream, to activate the buffer
input.unget(); //put the character back to undo the get()

size_t file_size = buf_ptr->in_avail();
//a value of 0 will be returned if the stream was not activated, per line 3.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top