GELÖST!!! .txt zeile ändern



  • hallo zusammen,

    ich habe zum folgenden problem google wie doof durchsucht, auch einiges gefunden, komme aber nicht zum ziel...

    ich habe eine .txt welche wiefolgt aussieht:

    blablablablabla
    blablablablabla
    blablablablablablabla
    blablablablablablabla
    blablablablabla
    blablablablablablablablabla

    die erste zeile mit ### möchte ich durch [Execute] erstzen und die datei wieder speichern. (der restliche inhalt soll erhalten bleiben.

    ich weiß wie ich einen string ändere und wie ich in eine datei schreiben kann.
    kann dies aber nicht zusammenführen.

    wenn ich in die datei schreibe mit datei << "";
    wird aber immer die komplette datei überschrieben. trotz ios::app(oder verstehe ich das falsch?)
    es soll aber nur die erste zeile ersetzt werden

    #include <iostream>
    #include <fstream>
    #include <stdio.h>
    #include <windows.h>
    #include <time.h>
    #include <dos.h>
    #include <string>
    #include <algorithm>

    using namespace std;

    int main(){
    /*
    //Verstecken der Konsole
    HWND hwnd = FindWindow("ConsoleWindowClass",NULL);
    ShowWindow(hwnd,SW_HIDE);
    //cout << "Oo\n";
    */

    int i = 0;

    while(i< 2) {

    //hier wird geprüft ob .txt vorhanden ist
    ifstream fin; //("C:\\Users\\Jonny\\Desktop\\SFStoINOX\\inox.txt"); //Pfad MUSS zwingend mit zwei \\ angegeben werden!!!
    fin.open("C:\\Users\\Jonny\\Desktop\\SFStoINOX\\inox.txt", ios_base::in);

    string c;
    if (fin)
    {

    //einfaches ändern des strings
    cout << "File found" << endl;
    getline(fin, c);
    cout<<c;
    c.replace(1,3, "[Execute]");
    cout<<c;

    fin.close(); //Datei wieder schließen

    //erneut öffnen und in datei schreiben
    //jedoch überschreibt er alles troz ios::app
    fstream datei;
    datei.open("C:\\Users\\Jonny\\Desktop\\SFStoINOX\\inox.txt", ios::app);
    datei << "Textdatei schreiben." << endl;
    datei.close();
    }

    else
    {
    cout << "Could not find file!" << endl;
    }

    Sleep(10000);
    }

    }

    Danke schon mal für eure bemühungen!!!



  • wie wärs denn damit:

    - File zum lesen öffnen, erste zeile ignorieren, rest in std::vector<string> mit readline() speichern.
    - File schliessen
    - File zum schreiben öffnen (nicht mit append, sondern überschreiben)
    - [execute] reinschreiben
    - den kompletten std::vectorstd::string reinschreiben (for(int i=0;i<vector.size();++i) usw... )
    file schließen

    ?



  • Du kannst nicht einfach eine Zeile in einer Textdatei durch eine andere ersetzen. Was passiert denn wohl, wenn der neue Text kürzer oder länger als der Originaltext ist? Daher musst du immer den kompletten Dateiinhalt ab Anfang der ersten ersetzten Stelle neu schreiben.



  • [quote="padreigh"]wie wärs denn damit:

    - File zum lesen öffnen, erste zeile ignorieren, rest in std::vector<string> mit readline() speichern.
    - File schliessen
    - File zum schreiben öffnen (nicht mit append, sondern überschreiben)
    - [execute] reinschreiben
    - den kompletten std::vectorstd::string reinschreiben (for(int i=0;i<vector.size();++i) usw... )
    file schließen

    ?[/quote]

    DANKE für die Antwort.

    Das klingt alles sehr logisch und ich verstehe auch wie es sein soll.

    Mir fehlt aber leider das Wissen, wie ich dies nun effektiv in C++ umsetz.

    File zum schreiben öffnen..... geht das mit fin.open("C:\...", "w" oder "r"?

    und das reinschreiben? dann mit fin <<



  • Guck dir unter C++ Reference mal den Punkt C++ IO an, da werden die Methoden der C++ Streamklassen beschrieben.



  • ich habs jetz mal soweit verändert

    #include <fstream>
    #include <strstream>
    #include <string>
    #include <iostream>
    #include <stdlib.h>

    using namespace std;

    int main ()
    {
    char zeile [30];
    string Seite[20];

    ifstream dateiLese ("C:\\Users\\Jonny\\Desktop\\SFStoINOX\\inox.txt");
    ofstream dateiSchreibe ("C:\\Users\\Jonny\\Desktop\\SFStoINOX\\inox.ixm");
    if (dateiLese)
    {
    int i=0;

    while(dateiLese.getline (zeile, 30))
    {

    Seite[i]=zeile;

    dateiSchreibe <<"[Execute]"<<Seite[i] << "\n";

    i++;
    }

    dateiLese.close ();
    dateiSchreibe.close();
    }
    }

    das execute schreibt er aber jetz in jede zeile.
    was muss ich da noch machen, dass das nur in die erste eingefügt wird?



    1. Wenn du nur die erste Zeile schreiben willst solltest du das while() durch ein anderes Konstrukt ersetzen.
      2 )Ausserdem solltest du mit getline in einen string lesen, und nicht in ein char array fester Größe. Wenn die Zeile einmal länger als 30 Zeiche ist schepperts.
    2. Warum liest du die Zeilen in ein 20-elementiges Array ein wenn es std::vector gibt? Wenn die Datei mal länger als 20 Zeilen sein sollte schepperts auch.
    3. Der Header stdlib.h ist veraltet. In C++ bindet man stattdessen cstdlib ein.


  • int main ()
    {
    char zeile [30];
    string Seite[20];

    ifstream dateiLese ("C:\\Users\\Jonny\\Desktop\\SFStoINOX\\inox.txt");
    ofstream dateiSchreibe ("C:\\Users\\Jonny\\Desktop\\SFStoINOX\\inox.ixm");
    if (dateiLese)
    {
    int i=0;

    while(dateiLese.getline (zeile, 30))
    {

    Seite[i]=zeile;

    if (i==0){
    dateiSchreibe <<"[Execute]" << "\n";
    }

    dateiSchreibe <<Seite[i] << "\n";

    i++;
    }

    dateiLese.close ();
    dateiSchreibe.close();
    }
    }



  • Bitte verwende mal die [ cpp ] Tags, den Code so zu lesen ist grausam.
    Ungefähr so geht es:

    int main()
    {
       string zeile;
       std::vector<string> seite;
    
       ifstream lesen("Eingabe.txt");
       ofstream schreiben("Ausgabe.txt");
    
       if ( lesen )
       {
           int ignore_first = 0;
           while ( !lesen.eof() )
           {
              getline(lesen, zeile);
              ++ignore_first;
              if ( ignore_first != 1 )
                  seite.push_back(zeile);
           }
       }
       if ( schreiben )
       {
           schreiben << "[Execute]" << std::endl;
           for ( int i = 0; i > seite.size(); i++ )
           {
              schreiben << seite[i] << std::endl;
           }
       }
    
       lesen.close();
       schreiben.close();
    }
    

    Nicht getestet, aber sollte helfen ;).
    lg



  • JonnyDaVinci schrieb:

    int main ()
    {
    char zeile [30];
    string Seite[20];

    ifstream dateiLese ("C:\\Users\\Jonny\\Desktop\\SFStoINOX\\inox.txt");
    ofstream dateiSchreibe ("C:\\Users\\Jonny\\Desktop\\SFStoINOX\\inox.ixm");
    if (dateiLese)
    {
    int i=0;

    while(dateiLese.getline (zeile, 30))
    {

    Seite[i]=zeile;

    if (i==0){
    dateiSchreibe <<"[Execute]" << "\n";
    }

    dateiSchreibe <<Seite[i] << "\n";

    i++;
    }

    dateiLese.close ();
    dateiSchreibe.close();
    }
    }

    Sorry, aber das ist murks. Lies den Post von DocShoe. Irgendwann schepperts...



  • so geht's auch:

    #include <iostream>
    #include <fstream>
    #include <limits>
    
    int main()
    {
        using namespace std;
        ofstream ziel("inox.ixm");
        ziel << "[Execute]" << endl;    // 1.Zeile neu schreiben
        ifstream quelle("inox.txt");
        quelle.ignore( numeric_limits< streamsize >::max(), '\n' ); // 1. Zeile ignorieren
        ziel << quelle.rdbuf(); // Rest ab Anfang der 2.Zeile nach 'ziel' schreiben
    
        return 0;
    }
    

Anmelden zum Antworten