komplette Datei -> Char-Array



  • ich will einfach nur den gesamten Inhalt einer Datei in einem Char-Array speichern
    aber egal wie ichs probier, es ist immer der Wurm drin

    ich habs mal so probiert:

    ifstream in(argv[2], ios::binary | ios::in);
    char buffer2[1];
    char buffer3[1];
    int size = 0;
    while(true)
    {
     buffer3 = buffer2;
     buffer2[size+1];
     buffer2 = buffer3;
     in.read(buffer3, 1);
     if(in.eof())break;
     buffer2[size] = buffer3[0];
     size++;
    }
    in.close();
    printf("Inhalt der Datei %s:\n\n", argv[2]);
    printf(buffer2);
    

    aber komischwerweiße funktioniert das nur bei manchen Dateien
    bei den anderen fehlt das Ende, aber ich hab nicht die geringste Ahnung warum

    gibts vielleicht irgendeine viel einfachere Lösung für mein Problem?
    überall nur Funktionen die ein Zeichen oder eine Zeile lesen



  • char buffer2[1];
    char buffer3[1];
    

    Was soll das? Du vergrößerst ein Array nicht dadurch, dass du einfach den Index vergrößerst. Du bewegst dich quasi in einem Minenfeld (in diesem Fall Speicher, der nicht dir gehört). Außerdem ist Arrayzuweisung doch eigentlich gar nicht definiert?! Wie wärs, wenn du einfach den ganzen Quatsch in einen std::string einliest, dann bekommst du mit c_str () was du willst (wofür auch immer).



  • Nick H. schrieb:

    ich will einfach nur den gesamten Inhalt einer Datei in einem Char-Array speichern
    aber egal wie ichs probier, es ist immer der Wurm drin ..
    gibts vielleicht irgendeine viel einfachere Lösung für mein Problem?

    Hallo Nick,

    Ja - in C++ ist vieles ganz einfach, wenn man sich ein wenig mit der STL auskennt. Nutze statt eines Char-Arrays einfach den std::string. Dann könnte es so aussehen:

    #include <algorithm>    // copy
    #include <iostream>
    #include <fstream>
    #include <iterator>     // istreambuf_iterator; back_inserter
    #include <string>
    
    int main( int argc, char* argv[] )
    {  
        using namespace std;
        if( argc < 3 ) return -1; // Parameter ncht angegeben
    
        string buffer;
        ifstream in( argv[2] );
        copy( istreambuf_iterator< char >( in ), istreambuf_iterator< char >(),
            back_inserter( buffer ) );
        // alle Zeichen aus der Datei stehen in 'buffer'
    
        return 0;
    }
    

    (Bem.: in der native STL von MS VC 6 ist kein string.push_back implementiert, dort übersetzt dieser Code nicht)

    Gruß
    Werner



  • danke ich werds mal so probieren
    benutze eh Dev-C++

    edit:

    funkt nich

    erstmal findet er istreambuf_iterator nicht
    ich habs einfach mal durch istream_iterator ersetzt
    aber dann hagelt es fehlermeldungen

    es muss doch irgendwo eine ganz einfache Möglichkeit geben
    aber ich such schon ewig bei Google...

    edit:

    so jetzt funktionierts schon fast:
    
    std::string line;
    std::string file;
    std::ifstream ifs(argv[2]);
    while(std::getline(ifs,line))
    {
     file += line;
    }
    ifs.close();
    

    nur sind alle meine Absätze weg 🙄
    ich brauch aber jedes zeichen das in der Datei steht
    wie kann ich das erreichen?



  • Wenn du es wirklich mit einem char-Array machen willst, geht das z.B. so:

    #include <iostream>
    #include <fstream>
    
    int main()
    {
        std::ifstream fin("file", std::ios::in|std::ios::binary);
        std::ios::pos_type start = fin.tellg();
    
        fin.seekg(0, std::ios::end);
        std::ios::pos_type end = fin.tellg();
    
        fin.seekg(0, std::ios::beg);
    
        const int SIZE = end - start;
    
        char* fcontent = new char[SIZE+1];
    
        fin.read(fcontent, SIZE);
        fcontent[SIZE] = '\0';
    
        // mach was...
    
        delete[] fcontent;
        return 0;
    
    }
    


  • Nick H. schrieb:

    funkt nich

    erstmal findet er istreambuf_iterator nicht
    ich habs einfach mal durch istream_iterator ersetzt
    aber dann hagelt es fehlermeldungen

    es muss doch irgendwo eine ganz einfache Möglichkeit geben

    Hallo Nick,

    es gibt mehr als einen einfachen Weg. Versuch' mal das:

    #include <iostream>
    #include <fstream>
    #include <string>
    #include <sstream>
    
    int main( int argc, char* argv[] )
    {  
        using namespace std;
        if( argc < 3 ) return -1; // Parameter nicht angegeben
    
        stringstream strm;
        ifstream in( argv[2] );
        strm << in.rdbuf();
        string buffer = strm.str();
        // alle Zeichen aus der Datei stehen in 'buffer'
    
        return 0;
    }
    

    Gruß
    Werner


Anmelden zum Antworten