Textdatei kopieren und formatieren



  • Schönen Nachmittag zusmamen,

    Folgendes Problem: Ich muss eine Textdatei zum Lesen Öffnen, eine weitere zum Schreiben öffnen. Dann wird die erste in die zweite kopiert. Die Kopie in der zweiten Datei soll dann formatiert erscheinen (80 Zeichen pro Zeile etc).
    Hab ein paar verschiedene Ansätze, aber dieser scheint mir am vielversprechensten...

    #include <iostream>
    #include <fstream>
    
    using namespace std;
    
    inline void openError(const char* s)
    {
           cerr << "Fehler beim Oeffnen der Datei" << s << endl;
           exit(1);
    }
    inline void writeError(const char*s)
    {
           cerr << "Fehler beim Schreiben der Datei" << s << endl;
           exit(2);
    }
    
    int main(int argc, char *argv[])
    {
        char     filename[128], filename2[128];
        ifstream file,file2;
        char     zeile[1024], zeile2[1024];
        string inhalt="";
    
        // Dateinamen einlesen
        cout << "Dateinamen eingeben: " << flush;
        cin.getline(filename, 127);
    
        // Datei öffnen
        file.open(filename, ios::in);
    
        if (file.good())
        {
            // Wenn die Datei geoeffnet werden konnte...
    
            // An den Anfang der Datei springen
            file.seekg(0L, ios::beg);
    
            while (! file.eof())
            {
                // Die Datei zeilenweise auslesen
                file.getline(zeile, 1024);
                cout << zeile << endl;
            }
        }
        else
        {
            // Wenn die Datei nicht geoeffnet werden konnte,
            cout << "Datei nicht gefunden." << endl;
        }
    
        cout << "Dateinamen eingeben: " << flush;
        cin.getline(filename2, 127);
    
          // Textdatei zum schreiben öffnen.
        file2.open(filename2, ios::out);
    
        for(int i = 0; i < inhalt.length(); i++)
        {
    
                file2.write((char*)&inhalt[i], sizeof(char));
    //Diese Zeile scheint falsch zu sein, aber warum?
        }
    
        file2.close();
    
        system("PAUSE");
        return 0;
    }
    

    Hab 2 Fragen an euch:
    Warum funktioniert die Zeile mit dem "write" im unteren drittel des codes nicht?
    hat jemand eine Idee, wie ich eine Zeilenumbruch erzwinge, sobald das Zeichen "{" kommt und vor allem wo im Programm das hinkommt.

    if(ch=='{')
         {
           cout << ??
         }
    

    Vielen Dank schon mal
    Vanessa



  • vankitz schrieb:

    Warum funktioniert die Zeile mit dem "write" im unteren drittel des codes nicht?

    Was funktioniert denn nicht?



  • Wir sind in C++, mit char-Arrays wird nicht mehr hantiert. Benutze generell den std::string dafür.

    char filename[128];
    cin.getline(filename, 127);
    // wird zu:
    string filename;
    getline(cin, filename);
    

    Dann löst sich dein Fehler in Luft auf:

    file2.write((char*)&inhalt[i], sizeof(char)); // sizeof(char) ist ein falsches Argument, strlen(&inhalt[i]) wäre richtig
    // neu:
    file2 << inhalt;
    

    Du mischst mir zu viel C-Sachen in C++-Code, versuche das zu vermeiden.



  • die fehlermeldung lautet:
    ifstream has no member named "write"

    aber write ist doch in der fstream bibliosthek drin... 😕



  • oh, ok , danke euch:)



  • Statt die Zeichen einzeln in der for-Schleife zu schreiben, kannst du auch gleich den gesamten String angeben.
    Für dein zweites Problem, schau dir mal die Methoden insert und find von String an. Damit kannst du einfach das Zeichen suchen und ein Zeilenumbruch danach einfügen lassen. Die folgenden Zeichen rücken dabei um eins nach hinten. Das müsstest du machen, bevor du den String mit write schreibst.



  • vankitz schrieb:

    ifstream has no member named "write"

    Das i steht ja auch für Eingabe, was du willst ist aber eine Ausgabe (ofstream).



  • Den eigentlichen Fehler habe ich übersehen:

    ifstream file,file2;
    

    ifstream heisst: Input Stream (Eingabestrom)
    ofstream heisst: Output Stream (Ausgabestrom)
    fstream kombiniert beide.

    Wenn du in die eine Datei schreiben willst, musst du dafür den ofstream verwenden.



  • demnach würde das dann so aussehen:

    int main(int argc, char *argv[])
    {
        string   filename, filename2;
        ifstream file;
        ofstream file2;
        getline(cin,filename);
    ...
    

    bin ich auf der richtigen spur?



  • spitze:) danke für eure hilfe



  • hm, irgendwas funktioniert jetzt nicht mehr.

    hab ja die änderungen vorgenommen, nur bekomm ich jetzt eine fehler meldung bei "file.open..." hab schon alles mögliche versucht, aber ohne glück:(

    int main()
    {
        string   filename, filename2;
        ofstream file2;
        char     zeile[1024], zeile2[1024]; 
        string inhalt="";
    
        // Dateinamen einlesen
        cout << "Dateinamen eingeben: " << flush;
        getline(cin,filename);
    
        // Datei öffnen
        ifstream file;
        file.open(filename,ios_base::in);
    

    egal in welchem tutorial ich nachsehe, das öffnen von textdateien wird so gehandhabt... aber irgendwo muss der hund doch begraben sein...
    lg



  • vankitz schrieb:

    hab ja die änderungen vorgenommen, nur bekomm ich jetzt eine fehler meldung bei "file.open..."

    Es würde wirklich helfen, wenn du in Zukunft nicht nur sagst, dass du eine Fehlermeldung bekommst, sondern diese auch postest. Sonst muss man immer erst raten, was denn falsch sein könnte, anstatt sich an der Meldung zu orientieren. 🙂



  • ifstream::open nimmt keinen std::string als erstes Argument sondern einen C-String.
    http://www.cplusplus.com/reference/iostream/ifstream/open/
    Also:

    file.open(filename.c_str(),ios_base::in);
    

    edit: Du bist ja immernoch mit char-arrays zu Gange. 😛



  • auweh... jo mir raucht der kopf auch, könnt ihr mir glauben...
    aber es wird wahrscheinlich wieder ein c vs c++ problem sein...ich schau noch mal alles durch
    danke für den hinweis:)



  • bzw danke für die antwort, aber bin schon ganz verwirrt heute
    wünsch euch einen schönen abend:)


Anmelden zum Antworten