problem mit dateigöße



  • hi,

    hab ein problem mit dem einlesen einer Datei, undzwar folgendes ich versuche so:

    string Textbuffer;
    	//File ist a char pointer to the Fileposition
    	fstream FileBin(File);//open File
    
    	if(!FileBin.is_open()) cout << "can't open File\n";
    
    	// 1. get Filesize
        FileBin.seekg(0, ios::end);
        unsigned long FileSize = streamoff(FileBin.tellg());
        FileBin.seekg(0, ios::beg);
    
        // 2. allocate Buffer and read File
        char* Buffer = new char[FileSize];
        FileBin.read(Buffer, FileSize); 
    
    	sprintf(Buffer,"%s\0",Buffer);
    
    	Textbuffer = Buffer;
    
    	cout << "Filesize: " << FileSize << endl << "Textsize: " << Textbuffer.length() << endl
            cout << "Buffersize: " << strlen(Buffer) << endl;
    	cout << "Output of File: " << Textbuffer.c_str() << endl;
    

    die Datei einzulesen. Er zeigt mir auch die gleiche größe von FileSize, Textsize und Buffer an nur gibt er mir nen viel längeren Text aus. Wo am ende noch unsinn angehängt wird. Benutze MSVC 7.1 und den Dev-Cpp



  • Versuch es mal so:

    string Textbuffer;
        //File ist a char pointer to the Fileposition
        ifstream FileBin(File, ios::binary);//open File in binary mode <---
    
        if(!FileBin) //Damit wird implizit auf eof-, fail- und bad-Bit geprüft
      // was noch fehlt ist eine sinnvolle Behandlung, wenn die Datei nicht geöffnet werden konnte.
            cout << "can't open File\n";
    
        // 1. get Filesize
        FileBin.seekg(0, ios::end);
        unsigned long FileSize = streamoff(FileBin.tellg());
        FileBin.seekg(0, ios::beg);
    
        // 2. allocate Buffer and read File
        char* Buffer = new char[FileSize];
        FileBin.read(Buffer, FileSize); 
    
        sprintf(Buffer,"%s\0",Buffer);
    
        Textbuffer = Buffer;
    
        cout << "Filesize: " << FileSize << endl << "Textsize: " << Textbuffer.length() << endl
            cout << "Buffersize: " << strlen(Buffer) << endl;
        //string hat den op<< für sich überladen, es ist also nicht notwenidig sich den const char* zu holen
        cout << "Output of File: " << Textbuffer << endl;
    


  • ne das funzt nicht, bei mir beendet er das prog gleich.



  • // 2. allocate Buffer and read File
        char* Buffer = new char[FileSize+1];
        FileBin.read(Buffer, FileSize); 
    
        sprintf(Buffer,"%s\0",Buffer);
    
        Textbuffer = Buffer;
    


  • ne, der packt am ende immer noch so nen scheiß(es fängt nach instructions an)

    JMP.A $-2, #0 ; Loops back two instructions.
    ═════════════════²²²²¦¦¦¦¦¦♠☻N



  • Hmm, also cout hat ja das Problem das es wenn keine binaere Null findet Speicher raus liest, bis irgendwo ne 0 steht, so sieht die Ausgabe ja auch aus.
    Das kann man im Debug auch schoen beobachten, der Buffer und Textbuffer sind nie Null terminiert. Wuerde die falsche Ausgabe erklaeren. Allerdings kann ich mir nicht erklaeren wieso da keine binaere Null drankommt.
    Ich guck nochn bisschen 😉


  • Mod

    "%s\0"
    

    das bringt nichts - jede funktion die mit char* arbeitet wird nat. bereits bei diesem '\0' aufhören und nicht erst wenn tatsächlich das ganze literal verarbeitet wurde. im übrigen ist Buffer gar nicht groß genug um noch ein weiteres zeichen aufzunehmen.

    char* Buffer = new char[FileSize+1]();
        FileBin.read(Buffer, FileSize);
    
        Textbuffer = Buffer;
    

    kann man besser machen, müsste aber zumindest funktionieren.



  • ja, das stimmt sprintf haengt ja auch selbst ne binaere Null an von daher wars unnoetig. Das ist ja der format string, so haette er, wenn sprintf es nicht eh schon machen wuerde ne binaere Null angehangen 😉

    MSDN sagt:

    A null character is appended after the last character written.

    wobei ich mir gerade nicht sicher bin ob wir wirklich den Fehler gefunden haben..

    sprintf haengt scheinbar keine \0 an.



  • Hallo,

    @camper
    read fügt allerdings keine 0 an. Also müsste bei dir noch sowas wie

    Buffer[ FileSize] = '\0';
    

    eingefügt werden. Wenn in Buffer allerdings irgendwo eine 0 vorkommt, sollte bei der Zuweisung an ein std::string vorher schon abgebrochen werden.

    Ciao



  • PunI$0R schrieb:

    sprintf haengt scheinbar keine \0 an.

    Doch, tut es. Aber read tut das nicht. Und mit %s sagt man sprintf, dass es alles bis zum \0 einfügen soll.

    sprintf zu sagen, dass es dort, wo es ein Stringendezeichen findet, ein Stringendezeichen einfügen soll, ist ziemlich sinnlos.



  • Das Problem ist schlicht und einfach dass im file kein '\0' steht => da du binär liest hast du auch kein '\0' am ende des strings.
    Lösung : nach dem lesen mit Buffer[FileSize] = 0; eine string daraus machen. dann funktioniert auch die ausgabe mit cout oder printf;
    Kurt



  • @MFK: ok, wusste ich nicht..


  • Mod

    Braunstein schrieb:

    @camper
    read fügt allerdings keine 0 an.

    die 0 steht ja schon da:

    char* Buffer = new char[FileSize+1][b]()[/b];
    

    Buffer[FileSize] = 0; funktioniert nur, wenn read tatsächlich FileSize bytes gelesen hat - andernfalls ist ein teil der daten immer noch müll.



  • Ok, die Klammer hatte ich übersehen.
    Das mit dem Einlesen ist schon klar. read liest nur dann nicht FileSize Bytes wenn vorher ein eof kommt. Das könnte man ja noch abtesten.
    Soweit ich weiß, ist die hier angewandte Methode die Dateigröße zu bekommen sowieso nicht exakt, weswegen dabei immer mal Fehler auftreten können.



  • danke für die antworten hab's gelöst bekommen

    fstream File(FileDirectory, ios::binary | ios::in);//open File
    
        //... all the other stuff
    
        // 2. allocate Buffer and read File
        char* Buffer = new char[FileSize+1];
    	File.read(Buffer, FileSize);
    	Buffer[FileSize]= '\0';
    

Anmelden zum Antworten