Fehler beim Datei-Laden



  • Ich stehe mal wieder vor einem Problem, und zwar beim Laden einer Datei. Es wird seltsamerweise immer nur ein Bruchteil der Datei geladen (egal, wie groß die Datei ist) und ich weiß nicht warum.
    Ich benutze fstream, in der Ladefunktion wird zunächst die Anzahl der Bytes ermittelt, dann ein entsprechend großes char-Feld angelegt und die Datei eingelesen. Nur wieso bekomme ich nicht die ganze Datei???

    RGB_Bild *ladePPM(const string &filename)
    {
        ifstream count(filename.c_str());
        long size=0;
        char *data;
        while(!count.eof())
        {
            char t = count.get();
            size++;
        } size--;
        count.close();
    
        ifstream in(filename.c_str());
        data = new char[size];
        for(long i=0; i<size; i++)
           data[i] = in.get();
        in.close();  
    
        RGB_Bild *bild;
        bild = parsePPM(data, size);
        return bild;
    }
    

    Ich komme einfach nicht dahinter, wo der Fehler liegen könnte ...



  • Ich dachte mir, ich greife mal auf die gute alte stdio-Header zurück und probiere es wie folgt:

    ...
    long size=0;
    FILE *datei = fopen(filename.c_str(), "r");
    while(int c = fgetc(datei) != EOF) size++;
    rewind(datei);
    char *data = new char[size];
    for(long i=0; i<size; i++) data[i]=fgetc(datei);
       ...
    

    Aber das Problem bleibt bestehen, auch hier werden Dateien nur bis zu einer bestimmten Stelle eingelesen.



  • Das Hauptproblem dürfte sein dass du die Datei im Textmode öffnest. Die Datei zweimal zu lesen ist auch nicht gerade wirtschaftlich.
    Angeblich gibts mit dieser Lösung irgendwelche Probleme. Bis jetzt hats aber noch immer funktioniert.

    #include <iostream>
    #include <fstream>
    
    using namespace std;
    
    int main() {
       ifstream in("./a.out", ios::in | ios::binary );
       in.seekg(0, ios::end );
       size_t sz = in.tellg();
       cout << "file size of a.out = " << sz << " bytes" << endl;
       in.seekg(0, ios::beg);
       char * buffer = new char[sz];
       in.read(buffer, sz);
       // ....
       delete [] buffer;
    }
    

    Kurt



  • Danke, das scheint zu funktionieren.

    Das Hauptproblem dürfte sein dass du die Datei im Textmode öffnest.

    Warum?



  • Evolver schrieb:

    Danke, das scheint zu funktionieren.

    Das Hauptproblem dürfte sein dass du die Datei im Textmode öffnest.

    Warum?

    Weiss nicht ob du an einem Windows-Pc sitzt aber im textmode wird '\n' als ein Zeichen gezählt. Das sind aber im file 2 Zeichen. Dann ist da noch das Zeichen 0x1A das im Textmode eof bedeutet.
    Kurt


Anmelden zum Antworten