Problem beim Ermitteln der Größe einer Datei
-
Hallo, ich will 2,79 GB große Datei in den Vector laden aber der stürtzt immer ab da GetFileSize einen negativen Wert zurück gibt die Datei scheint wohl zu groß zu sein.

Gibts eine andere möglichkeit das alles in den Speicher zu laden?
Oder muss ich das vielleicht auf mehrere Vectoren aufteilen oder so?#include <iostream> #include <fstream> #include <vector> #include <string> using namespace std; long long GetFileSize(string Filename) { bool ret = CheckIfFileExists ( Filename ); if ( ret == false ){ return -1; } long Filesize=0; ifstream file ( Filename.c_str() ); file.seekg(0,ios::end); Filesize = file.tellg(); file.seekg(0,ios::end); return Filesize; } int main() { long long Filesize_1 = GetFileSize( Filename_1 ); vector<unsigned char>Data_1 (Filesize_1); ReadFile( Data_1, Filename_1, Filesize_1 ); return 0; }[/cpp]
-
Benutz doch std::streamsize, wenn du die Länge eines Streams feststellen möchtest. Welchen Sinn hat die Benutzung eines vorzeichenbehafteten Typs, wenn man eine Größe angeben möchte?
Musst du eine 2.7 GB Datei wirklich an einem Stück einlesen? Dies deutet meistens auf einen schweren Designfehler hin.
Im übrigen deutet die Größe eines long auf deinem System stark darauf hin, dass du für ein 32 Bit System entwickelst. Da wäre es ohnehin ein kleines Wunder, wenn ein Programm 2.7 GB Speicher am Stück allokieren kann.
-
SeppJ schrieb:
Da wäre es ohnehin ein kleines Wunder, wenn ein Programm 2.7 GB Speicher am Stück allokieren kann.
Vielleicht hat er nicht mal soviel Arbeitsspeicher, wer weiß wieviel da gepaged wird

-
FileSize** schrieb:
Hallo, ich will 2,79 GB große Datei in den Vector laden aber der stürtzt immer ab da GetFileSize einen negativen Wert zurück gibt die Datei scheint wohl zu groß zu sein.

Gibts eine andere möglichkeit das alles in den Speicher zu laden?
Oder muss ich das vielleicht auf mehrere Vectoren aufteilen oder so?#include <iostream> #include <fstream> #include <vector> #include <string> using namespace std; long long GetFileSize(string Filename) { bool ret = CheckIfFileExists ( Filename ); if ( ret == false ){ return -1; } long Filesize=0; ifstream file ( Filename.c_str() ); file.seekg(0,ios::end); Filesize = file.tellg(); file.seekg(0,ios::end); return Filesize; } int main() { long long Filesize_1 = GetFileSize( Filename_1 ); vector<unsigned char>Data_1 (Filesize_1); ReadFile( Data_1, Filename_1, Filesize_1 ); return 0; }[/cpp]
http://msdn.microsoft.com/en-us/library/windows/desktop/aa364957(v=vs.85).aspx
Probiers mit dem.
64 bit Zahlen sollten genug sein.
-
IrgendeinName schrieb:
FileSize** schrieb:
Hallo, ich will 2,79 GB große Datei in den Vector laden aber der stürtzt immer ab da GetFileSize einen negativen Wert zurück gibt die Datei scheint wohl zu groß zu sein.

Gibts eine andere möglichkeit das alles in den Speicher zu laden?
Oder muss ich das vielleicht auf mehrere Vectoren aufteilen oder so?#include <iostream> #include <fstream> #include <vector> #include <string> using namespace std; long long GetFileSize(string Filename) { bool ret = CheckIfFileExists ( Filename ); if ( ret == false ){ return -1; } long Filesize=0; ifstream file ( Filename.c_str() ); file.seekg(0,ios::end); Filesize = file.tellg(); file.seekg(0,ios::end); return Filesize; } int main() { long long Filesize_1 = GetFileSize( Filename_1 ); vector<unsigned char>Data_1 (Filesize_1); ReadFile( Data_1, Filename_1, Filesize_1 ); return 0; }[/cpp]
http://msdn.microsoft.com/en-us/library/windows/desktop/aa364957(v=vs.85).aspx
Probiers mit dem.
64 bit Zahlen sollten genug sein.Was bringt ihm denn das?
Er will doch die File in einenvectoreinlesen.
-
Sone schrieb:
IrgendeinName schrieb:
FileSize** schrieb:
Hallo, ich will 2,79 GB große Datei in den Vector laden aber der stürtzt immer ab da GetFileSize einen negativen Wert zurück gibt die Datei scheint wohl zu groß zu sein.

Gibts eine andere möglichkeit das alles in den Speicher zu laden?
Oder muss ich das vielleicht auf mehrere Vectoren aufteilen oder so?#include <iostream> #include <fstream> #include <vector> #include <string> using namespace std; long long GetFileSize(string Filename) { bool ret = CheckIfFileExists ( Filename ); if ( ret == false ){ return -1; } long Filesize=0; ifstream file ( Filename.c_str() ); file.seekg(0,ios::end); Filesize = file.tellg(); file.seekg(0,ios::end); return Filesize; } int main() { long long Filesize_1 = GetFileSize( Filename_1 ); vector<unsigned char>Data_1 (Filesize_1); ReadFile( Data_1, Filename_1, Filesize_1 ); return 0; }[/cpp]
http://msdn.microsoft.com/en-us/library/windows/desktop/aa364957(v=vs.85).aspx
Probiers mit dem.
64 bit Zahlen sollten genug sein.Was bringt ihm denn das?
Er will doch die File in einenvectoreinlesen.Ups. Hab nur den Titel und den src angeschaut.
Was willst du mit dem Ding machen, nachdem du es einelesen hast?
-
Naja, ich habe ein Win7 64 Bit mit 4 GB RAM.
Speziell 64Bit Code habe ich noch nie geschrieben.Was ich eigentlich machen will ist halt 2 große Binär Dateien miteinander vergleichen und die unterschiede auflisten.
Mit kleinen Dateien ist das alles kein Problem.
Ich habe gerade mal nach std::streamsize gegoogelt.
Aber irgendwie kann ich damit nichts anfangen.
http://www.cplusplus.com/reference/iostream/streamoff/
Und auch bei anderen googel Links finde ich nichts.
Ich könnte die Datei natürlich auch aufteilen und zu erst die eine hälfte und dann die andere hälfte lesen.
So wollte ich die Datei lesen:
void ReadFile( vector<unsigned char>&Data, string Filename, long Filesize ) { ifstream file ( Filename.c_str(), ios::binary ); file.read ( &Data[0], Filesize ); }Aber das funktioniert ja nicht ...
-
FileSize* schrieb:
Ich habe gerade mal nach std::streamsize gegoogelt.
Aber irgendwie kann ich damit nichts anfangen.
Dritter Link zu std::streamsize: http://en.cppreference.com/w/cpp/io/streamsize
-
Wieso musst du die Dateien in einem Stück einlesen, wenn du sie vergleichen möchtest? Stell dir zwei Kartenspiele mit hundert Karten vor. Breitest du die auch vorher komplett auf dem Tisch aus, wenn du vergleichen möchtest, ob die Karten in der gleichen Reihenfolge sind?
-
FileSize* schrieb:
Was ich eigentlich machen will ist halt 2 große Binär Dateien miteinander vergleichen und die unterschiede auflisten.
Dazu brauchst da aber nicht die ganze Datei (bzw. 2) komplett am Stück in den Hauptspeicher zu laden - es reicht in kleinen Blöcken (von einigen KB) zu lesen und diese dann zu vergleichen (oder gleich Byte für Byte aus dem Stream auslesen!) ...