Mysteriöse Zeichen beim Datei einlesen



  • Hi,
    ich bin noch ziemlich neu bei C++.
    Ich wollte ein Programm schreiben, welches eine beliebige Datei einlesen kann.
    Das funktioniert soweit auch ganz gut, aber ich frage mich woher die zusätzlichen Zeichen kommen?
    Wäre super wenn mir das jemand erklären könnte.

    Inhalt der Datei:

    Blablada
    bliblablup
    

    Ausgabe Des Programmes:

    Blablada
    bliblablup=²²²²½½½½½½½½
    

    Methode zum auslesen der Datei:

    char * loadFile(ifstream &istream)
    {
    	size_t size;
    	char *buffer;
    	streamoff curpos=istream.tellg();
    	istream.seekg(0,ios::end);
    	size=istream.tellg();
    	istream.seekg(curpos);
    
    	buffer=new char[size];
    	istream.read(buffer,size);
    	cout<<buffer<<endl;
    	return buffer;
    }
    


  • du musst noch ein nullzeichen an den stirng hinten anhängen, sonst weiß der computer nicht, wo der string zuende ist



  • Und dein Code ist so nicht ganz sinnig:

    void load_file(std::ifstream& in, char* dest, std::size_t max_size)
    {
        const std::streampos pos_cur(in.tellg());
        in.seekg(0, std::ios::end);
        const std::streampos pos_end(in.tellg());
        in.seekg(0, std::ios::beg);
        in.read(dest, std::min<std::size_>(max_size, pos_end) * sizeof(char));
        in.seekg(pos_cur, std::ios::beg);
    }
    

    ... Entweder, du lädst nur ab der Position wo der Cursor im Moment ist (dann ist size - pos_cur die richtige Größe und nicht nur size) oder du lädst die komplette Datei und gehst dann wieder an die alte Stelle.



  • Ich würde sowieso vorschlagen, du machst dir das Leben leicht und nutzt alle Möglichkeiten von C++, inklusive Strings und Iteratoren. Dann brauchst du dir um das Abschliessen deines char-Arrays mit einer 0 auch keine Sorgen mehr zu machen 😉 .

    #include <iterator>
    #include <string>
    
    // ...
    
    string loadFile(ifstream &istream)
    {
        istream.unsetf(ios::skipws);
        string str = string(istream_iterator<char>(istream), istream_iterator<char>());
        return str;
    }
    
    // oder noch eleganter
    
    void loadFile(ifstream &istream, string &str)
    {
        istream.unsetf(ios::skipws);
        str = string(istream_iterator<char>(istream), istream_iterator<char>());
    }
    
    // und falls eben doch so ein frickliges Char-Array zurückgegeben werden muss
    
    char * loadFile(ifstream &istream)
    {
        istream.unsetf(ios::skipws);
        string str = string(istream_iterator<char>(istream), istream_iterator<char>());
    
        char *buffer = new char[str.size() + 1];
        strcpy(buffer, str.c_str());
        return buffer;
    }
    

    Viel Spass noch und beste Grüsse
    Kessi


Anmelden zum Antworten