Avatar billede mbm2016 Nybegynder
12. oktober 2009 - 22:33 Der er 7 kommentarer og
1 løsning

Handle filer over 1 mb?

Hej eksperter,

Jeg sidder og prøver at lave et program som kan kopiere filer, men mens jeg sidder og afprøver det finder jeg ud af at programmet ikke kan kopiere filer over 1 mb eller i hvert fald der omkring. Jeg forstår ikke hvorfor da jeg jo har sat bufferen til næsten 2mb. Herunder er de funktioner jeg bruger når jeg kopiere:

string GetFileContents(const char * filename)
{
        stringstream indhold;
        int length;
        char * buffer;

        ifstream is;
        is.open (filename, ios::binary );

        // get length of file:
        is.seekg (0, ios::end);
        length = is.tellg();
        is.seekg (0, ios::beg);

        // allocate memory:
        buffer = new char [length];

        // read data as a block:
        is.read (buffer,length);
        is.close();

        indhold.write (buffer,length);

        delete[] buffer;

        return indhold.str();
}

int SetFileContents(const char * filename,string contents)
{
        stringstream indhold;
        char linje[2000000];
        ofstream openfile(filename,ofstream::binary);
        openfile << contents;
        openfile.close();

        return 0;
}

På forhånd tusinde tak for hjælpen ;)

Ps. Jeg ved godt jeg ikke fanger nogle exceptions :)

/Magnus
Avatar billede arne_v Ekspert
12. oktober 2009 - 22:40 #1
Jeg vil gætte på at det er:

char linje[2000000];

som driller.

Der er normalt restriktioner på stack size.

Prøv og alloker fra heap i.s.f..

Hvis du altså behøver den! (det ser ikke ud til at du bruger den)
Avatar billede arne_v Ekspert
12. oktober 2009 - 22:40 #2
Generelt er det nok problematisk at ville kopiere filer udfra en forudsætning om at man kan have alt i memory.
Avatar billede mbm2016 Nybegynder
12. oktober 2009 - 22:51 #3
Tak for svarene begge to, men heap står ikke i min Grundbog, stack gør men jeg forstår den ikke. Vil i ikke være søde at forklare mig hvad det går ud på og hvordan jeg så gør. Evt. med kode eksempler

På forhånd tak
Avatar billede arne_v Ekspert
12. oktober 2009 - 22:53 #4
void f()
{
  char linje[2000000];
  ...
}

allokerer på stak.

void f()
{
    char *linie = new char[2000000];
    ...
    delete[] linie;
}

allokerer fra heap.
Avatar billede mbm2016 Nybegynder
13. oktober 2009 - 10:43 #5
Efter du skrev dette opdagede jeg faktisk at min char linie ting faktisk er overflødig, så problemet må ligge andetsteds.

Kan i spore problemet må i meget gerne skrive dette?

På forhånd tak
Avatar billede arne_v Ekspert
13. oktober 2009 - 23:54 #6
Har du fjernet linien?
Avatar billede arne_v Ekspert
13. oktober 2009 - 23:55 #7
Prøv evt. også at sende content over som ref.
Avatar billede mbm2016 Nybegynder
14. oktober 2009 - 13:22 #8
Jeg fandt ud af at min fejl lå i et jeg delte strengen op med en selv defineret split/explode funktion, som jeg ikke medgav her på eksperten.

Det var i denne selv lavede split/explode funktion at programmet crashede, derfor lavede jeg den om så den bare kørte igennem filen bogstav efter bogstav, og checkede om delimeteret fandtes, og derefter lagde delen ind i et pointer array.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester



IT-JOB

Metroselskabet og Hovedstadens Letbane

BIM Coordinator

PensionDanmark

MS Dynamics-udvikler