Funkcja kopiująca pliki

0

witam,
pisząc funkcję kopiującą pliki, napotkałem się z takim oto problemem;
Mam taki kod:

int MAX_BUFF=10;

int kopiujPlik(char *zrodlo, char* cel){
    char buff[10];
    ifstream plik1 (zrodlo);
    ofstream plik2 (cel);
    plik1.seekg(0,ifstream::end);
    int rozmiar=plik1.tellg();
    plik1.seekg(0);
    int poprz=rozmiar%MAX_BUFF;

    while(!plik1.eof()){
       cout<<rozmiar;
       plik1.read(buff, sizeof(buff));
       plik2.write(buff, (plik1.tellg()<0)?poprz:sizeof(buff));
    }
}

i wg mnie, jest optymalny pod względem czasowym. problem z pamięcią. Im większa wartość MAX_BUFF, tym szybciej się skopiuje, a zatem moje pytanie jest takie - czy da się jakoś wyznaczyć MAX_BUFF, tak aby nie przekraczało dostępnej pamięci, ale jednocześnie było możliwie jak największe?
Z góry dzięki za odpowiedź
Pozdrawiam

0
Loganek napisał(a)

czy da się jakoś wyznaczyć MAX_BUFF, tak aby nie przekraczało dostępnej pamięci

raczej nie sądzę , dla tablicy statycznej ilość dostępnej pamięci dla aplikacji na pewno będzie się zawierać w jakimś określonym
rozmiarze , lecz będzie on zmienny ponieważ inne procedury programu też z niej korzystają ..
Co do pamięci alokowanej przez new to tyle ile dysk (bo jest to pamięć "wirtualna" - sterta) wydoli i zmienne rozmiaru mogą pomieścić oraz STL się nie wywali , w każdym razie sporo .Dostępna pamięć dla aplikacji jest również zależna od systemu np. 32 czy 64 bit , WinApi dostarcza różnych funkcji do badania stanu i dostępu do pamięci aplikacji ale w tak prostych programach szkoda sobie zawracać tym głowę .

0

hmm, no ok, ale nawet jak robię to za pomocą new, to i tak muszę podać jakąś wartość będącą rozmiarem. Lecenie forem przez ileś tam wartości i sprawdzanie, czy wystarczy tyle pamięci to chyba nie jest dobre rozwiązanie. Więc MAx_BUFF nawet dla new muszę jakoś znaleźć, lub podać rozsądną liczbę. Jakieś propozycje?

0

A ile Ci trzeba , może INT_MAX , szukaj w limits.h

0

nie wiem ile ma INT_MAX, ale z nazwy domyślam się że ok 2GB. Czy to nie troche za dużo? czy program dostanie za każdym wykonaniem 2GB pamięci?

0

O , boże ,statycznie może nie dostać ale jak przydzielisz pamięć na stercie (new) to dostanie , jak przydzielisz kolejny blok to też dostanie
póki nie zabraknie pamięci wirtualnej w systemie .
Ps. Zrób sobie program testowy przydzielający w pętli bloki pamięci przez new i zobacz co się będzie działo :-) ...

0

jesteś pewien że na maszynie z 1 GB RAM system załatwi mi jeszcze 1GB wirtualnej? Być może, nie próbowałem... ale chyba ok 20MB wystarczy

0

Ram nie ma tu nic do rzeczy , raczej możliwość zaadresowania bloków , pamięć sterty jest "wirtualna" i leży na dysku twardym .

0

no tak, ale pamięć wirtualna też ma swój rozmiar(u mnie np. jest to 2 GB, ale ktoś inny może mieć mniej) Nie napiszę przecież użytkownikowi - zmień rozmiar pamięci wirtualnej. A 20 MB to mało? Wtedy korzystać będzie tylko z RAM, co jest szybsze od pamięci wirtualnej

0

No ma , ale jak się uprzesz to możesz zajechać cały dysk na potrzeby swojej aplikacji , pakuj śmiało i nie zawracaj gitary.
20MB to jest NIC ...
Dotarło do Ciebie że pamięć dla aplikacji w stercie jest "symulowana" przez HD ? .

0

Pamięć wirtualna ma na 32 bitowych systemach praktycznie zawsze 4Gb, z czego 1-2 Gb zajmuje system.

Ale i tak nie rozumiem co kombinujecie... Nie lepiej po prostu dynamicznie alokować tablice o wielkości takiej jak ma plik (ew. jeśli plik jest > 1 Gb dzielić na Gbajtowe części)

0

tak też zrobiłem:) dzięki za odpowiedzi:)

0

Ja zawsze robię tak:

char *buf = NULL;
int rozmiar = 100000;
while (!buf)
{ 
  buf = new(std::nothrow) char[rozmiar];
  if (!buf)
    rozmiar -= 100;
}

Pamięć alokujesz w programie tylko raz, a do funkcji kopiującej plik przekazujesz rozmiar i wskaźnik do bufora.

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