[c++] operacje na duużych plikach

0

Witam,
mam problem z operacjami na dużych plikach (2,5 GB). Czy sa jakies limity? i czy taki limit jest uzalezniony np od ilosci posiadanej pamieci RAM?
Podczas wykonywania, program sie w pewnym momencie wykrzacza.

Plik otwieram poleceniem ifstream z parametrami ios::in|ios::binary

Poprawnosc otwarcia pliku sprawdzałem poprzez if(!plik), jednak zaden blad sie nie pojawial.

Program takze nie chce odczytać pojemności pliku (filesize). Ustawiłem zmienną na unsigned long, tak aby mogła spokojnie poradzić sobie z tak wielką ilością bajtów (liczba 10cyfrowa), jednak wciąż mi pokazuje 0. Probowalem też "ręcznie" ustawić pojemnosc, tak by mozna bylo stworzyć tablice charów o okreslonej wielkosci, a następnie skopiowanie do niej zawartosci strumienia. NIestety kopiowanie skonczylo sie fiaskiem.

wydaje mi się, że te problemy pojawiaja sie poniewaz w "zly sposob" otweiram plik. No i chyba ten RAM tez ma tu coś do gadania.. ktoś moze pomoc?

0

2,5GB do ramu nie wczytasz, przynajmniej nie na na 32 bitowym Windowsie a z rozmiarem nie wiem co moze byc nie tak, w ulong powinno sie do 4GB zmiescic.

0

Program takze nie chce odczytać pojemności pliku (filesize). Ustawiłem zmienną na unsigned long,

A jak wyznaczasz rozmiar pliku ?
Brak kodu....
RAM nie ma tu nic do rzeczy.

0
//-----------ROZMIAR PLIKU-----------------------
unsigned long filesize,filesize2;
filesize2=plik.tellg();
plik.seekg(0,ios::end);
filesize=plik.tellg();
filesize-=filesize2;
plik.seekg (0, ios::beg);
//-----------------------------------------------
cout<<"Rozmiar pliku: "<<filesize<<endl;
0

Nie komplikuj :-)

    long rozmiar ;
    plik.seekg(0,ios::end);
    rozmiar = plik.tellg() ;
    cout << "Rozmiar pliku = " << rozmiar << endl ;
    plik.seekg(0,ios::beg);

    // rozmiar long 
    cout << sizeof(long) << endl ;

Fun tellg zwraca typ 'long' , u mnie jest to 4 bajty .
Jest to liczba ze znakiem i nic nie poradzi że zwrócisz ją do 'unsigned long'.
Rozmiar pliku nie mieści się w long .
Maksymalnie rozmiar pliku możliwy do zapisania w long to :
2,147,483,647 bajtów czyli 2GB (-1 bajt) .

0

no tak, ale zważ ze zakres zmiennej typu long zawiera także liczbt ujemne.
Przy wielkosci pliku liczb anie moze byc ujemna, a biorąc unsigned long mamy zakres 0 do 4294967295 dzieki czemu mozna "upchać" więcej.

Tak czy siak, dalej nie wiem co sie dzieje, dlaczego nie chce mi tego pliku otworzyc...

0

dzejo zwraca Twoja uwage na to, ze wynik zwracany jest jako long. Wiec Twoje podstawianie pod unsigned long niczego nie zmienia. Wynik i tak ma taki zakres jak long, wiec...

0

rozumiem :)

a znalazlem na necie coś takiego:

Large File Support (LFS). 

To read/write files larger than 2GB you need to specify some flags at compilation: 

Fortran: no additional flags needed. 

CC/C++: LFS is obtained by specifying the flags below when compiling and linking: 

	<b>-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE</b> 

Pytanko teraz do Was, gdzie sie określa te flagi? czyli gdzie mam to wstawić, w ktorym pliku/miejscu?

0

Ja nie rozumiem.
Czyli Linux ?
To nie wiem ... jakieś ten tellg niedorobiony , po co zwracać long ,,
ujemna pozycja w pliku ?

0
dzejo napisał(a)

Ja nie rozumiem.
Czyli Linux ?
To nie wiem ... jakieś ten tellg niedorobiony , po co zwracać long ,,
ujemna pozycja w pliku ?

Jeśli piszesz ten program pod windows, możesz użyc funkcji GetFileSizeEx

http://msdn2.microsoft.com/En-US/library/aa364957.aspx

0
fr3 napisał(a)

Jeśli piszesz ten program pod windows, możesz użyc funkcji GetFileSizeEx

http://msdn2.microsoft.com/En-US/library/aa364957.aspx

dzieki wielkie :)
GetFileSizeEx co prawda z tegp cp wyczytalem jest do plikow wiekszych niz4GB, ale poradzilem sobie z samym GetFileSize

int File = FileOpen("plik", fmOpenRead);

DWORD fileSize, fileSize2;
fileSize= GetFileSize((PVOID)File, &fileSize2);
0

Jeśli piszesz ten program pod .....

He,he.. tak myślałem .
ps.
Wyciąganie informacji od autorów postów typu
jaki system , jaki kompilator , jaki język to nuda
i niepotrzebna strata czasu .
(a może potrzebna ?)
Ja przynajmniej nie mogę pojąć dlaczego nie
opisać danego problemu poruszonego w wątku
dodając te proste i podstawowe informacje
które pozwalają na szybsze uzyskanie odpowiedzi,
co jest chyba w interesie pytającego.. [green]

0

Zazwyczaj dobrze postawione pytanie już prowadzi do odpowiedzi, dlatego takich mało na forum :). Samemu parę razy odpalałem 4p, pisze nowego posta, myślę sobie "jak tu dobrze zapytać żeby było wszystko jasne" i końcem końców wpadam na pomysł na odpowiedź i zamykam 4p :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1