Gelöst: .txt Datei Zeile ändern



  • Hallo,
    ich habe mittels:

    #define LAENGE 1000
    #define ANZAHL 1000
    int intline=5;            //zeile 5
    int i=0;
    char line[LAENGE][ANZAHL];
    FILE * pFile;
    extern string topicpath;
    pFile=fopen(topicpath.c_str(),"r");
    if (pFile!=NULL)
        {
            for(i = 0; i <= intline;i++) 
              {
              if ((fgets(line[i],LAENGE,pFile) != 0)&&(i==intline))
                 {
                 stringbuffer=line[i];
                 }
              }
        fclose (pFile);
        }     
    }
    

    zeile 5 ausgelesen...
    diese enthält ca. "5.1 Frühling;5.2 spring;5.3 1;5.4 1277737728."
    danach hab ich sie in "5.1 Frühling;5.2 spring;5.3 2;5.4 1277739000." geändert ...
    bis hierhin hat alles problemlos geklappt ->
    mein poblem: wie kann ich diesen barbeiteten string an zeile 5 meiner txt datei schreiben?
    MfG Lukas



  • Der Ansatz ist für C. Aber auch für C wäre der zweifelhaft: einfach mal 1 MB ungeachtet der tatsächlichen Zeilenanzahl und Zeilenlängen auf dem Stack belegen kann man nicht wirklich bringen.

    Ein C++-Umsetzung sieht so aus:

    #include <iostream>
    #include <fstream>
    #include <string>
    #include <vector>
    using namespace std;
    
    int main()
    {
      //Datei öffnen
      ifstream inFile("file.txt");
      //in lines speichern wir unsere Zeilen
      vector<string> lines;
      //temporärer String für die aktuelle Zeile
      string line;
      //solange noch alles paletti ist und Daten da sind...
      while (inFile.good())
      { //...lese eine Zeile ein und füge sie lines hinzu
        getline(inFile,line);
        lines.push_back(line);
      }
      //ändere die fünfte Zeile
      lines[4]="changedLine";
      //Datei schließen
      inFile.close();
      //und im Schreibmodus wieder aufmachen, dabei auf 0 bytes reduzieren (trunc)
      ofstream outFile("file.txt",ios::trunc);
      //alle Zeilen in die Datei schreiben
      for (vector<string>::iterator it=lines.begin();it!=lines.end();++it)outFile << *it << '\n';
    }/*bzw. auto                    it=...*/
    

    Edit: kommentiert.



  • Athar schrieb:

    }/*bzw. auto                    it=...*/
    

    was ist mit auto gemeint?



  • auto ist ein Schlüsselwort des kommenden C++-Standards und veranlasst den Compiler, selbst den richtigen Typ zu bestimmen.
    Ich habe es nur als Kommentar angemerkt, weil auto bei älteren Compiler-Versionen noch nicht verfügbar ist.



  • hay,
    sry, dass ich um dieses vorgekaue bitte... aber könntest du den geposteten code vl anfängerfreundlich kommentieren 😃 ... ich hatte davor nur in autoit programmiert (was mir weitaus leichter erschien/erscheint) -> der wechsel zu c++(bzw. winapi) fällt mir ziemlich schwer, da ich kein buch besitze und man via google oft falsches (bzw c findet , dass als c++ ausgegeben wird) ... was ist ein vektor? ich kenn das bis jetzt nur aus dem schul mathe unterricht
    MfG Lukas



  • Und genau das ist auch ein Vektor in der Programmierung, nur dass man nicht auf nummerische Werte beschränkt ist, sondern einen Vektor letztendlich wie eine Art Liste benutzen kann.

    Es gibt hier im Forum einige hilfreiche Beiträge, welche Bücher man lesen sollte. Eines davon war glaub ich auch ein OpenBook... Einfach mal nachschauen... Wobei man um gute Fachliteratur nicht drum herum kommt. Zudem hat C oder auch C++ nur bedingt was mit der WinAPI zu tun, nämlich nur wenn du Windows spezifische Programme, mit den vom OS bereitgestellten Funktionen programmierst.

    Es gibt auch das eine oder andere WikiBook, was nicht sooo schlecht ist, jedoch meistens auch immer hier und da ein bisschen "incomplete".



  • ifstream ist eine Klasse, um Dateien zu lesen.
    ofstream ist eine Klasse, um Dateien zu schreiben.
    string repräsentiert einen String.
    vector ist eine Implementation eines dynamischen Arrays.

    Alles weitere zu Memberfunktionen & Co. steht in den verlinkten Seiten der C++-Referenz.



  • hay ich wollte mich mal für die nette hilfe bedanken 😛
    dank euch klappt jetzt alles und ich hab es sogar geschafft ein paar andere sachen anhand des beispiels zu ändern -> deswegen jetzt nochmal ne kleine frage:
    ich möchte aus einem dokument nur eine bestimmte zeile lesen.
    die unten stehende funktion klappt bestens, trotzdem wüsste ich gerne ob es die ideale lösung ist ... zu meinem ersten post hab ich ja sofort als antwort bekommen "Der Ansatz ist für C. Aber auch für C wäre der zweifelhaft: einfach mal 1 MB ungeachtet der tatsächlichen Zeilenanzahl und Zeilenlängen auf dem Stack belegen kann man nicht wirklich bringen. " <- verschwende ich hier auch unnötig platz? -> ich lese ja alles aus, will aber nur bis zeile "z.B. 4" ist das verschwendung von resourcen oder ok?

    int randomint;
    string frage;
    vector<string> lines;
    string line;
    extern string topicpath;
    
    ifstream inFile (topicpath.c_str());
    
    while (inFile.good())
    { //...lese eine Zeile ein und füge sie lines hinzu
      getline(inFile,line);
      lines.push_back(line);
    }
    inFile.close();
    frage=lines[randomint];
    

    MfG Lukas


Anmelden zum Antworten