Textdateien Lesen/schreiben



  • Guten Tag,
    ich bin gerade dabei mir C++ selbst mithilfe eines Buches beizubringen.
    Als kleine übung versuche ich gerade ein Programm zu schreiben das eine art Protokollaufgabe übernehmen soll. Nun bin ich auf ein Problem gestoßen.
    Also mein Programm erstellt eine Textdatei mit einer art tabelle darin.
    danach frägt es in welcher zeile man etwas einfügen will.
    nun das Problem. Gibt es eine möglichkeit in der datei zu einem bestimmten punkt oder in eine bestimmte zeile zu springen dort etwas einzufügen und das ganze zu speichern?
    Bis jetzt kam ich nur auf die idee bis zu der zeile auszulesen, das ganze in einer anderen datei zwischenzuspeichern dann dort unten etwas ranzuhängen den rest aus der ersten auslesen das ganze dan wieder zambasteln...da das dann doch etwas umständlich und ineffizient wäre suche ich nach einer besseren lösung.

    dann noch eine andere frage.
    In meinem lernbuch wird das einlesen und schreiben in dateien immer einzeln gemacht.

    dazu wird immer jeweils mit ifstream und ofstream ein objekt erzeugt.
    aber wenn man die datei öffnet kann man ja als modus mit ios_base::app ios_base::out ios_base::in auch lesen schreiben und halt anhängen aber wie geht das genau denn wenn ich die datei öffne muss ich das ja dann immer mit dem jeweiligen ifstream oder ofstream objekt öffnen. kann mir jemand erklären wie ich die datei öffne damit ich beides machen kann ohne zwei objekte zu haben.

    bitte nicht zu kompliziert erklären ich bin noch kein profi 😃

    Liebe Grüße Sc0rpe



  • So, wie ich die Frage verstehe, hilft dir das hier:
    http://www.cplusplus.com/reference/iostream/ostream/seekp/



  • Sc0rpe schrieb:

    dann noch eine andere frage.
    In meinem lernbuch wird das einlesen und schreiben in dateien immer einzeln gemacht.

    dazu wird immer jeweils mit ifstream und ofstream ein objekt erzeugt.
    aber wenn man die datei öffnet kann man ja als modus mit ios_base::app ios_base::out ios_base::in auch lesen schreiben und halt anhängen aber wie geht das genau denn wenn ich die datei öffne muss ich das ja dann immer mit dem jeweiligen ifstream oder ofstream objekt öffnen. kann mir jemand erklären wie ich die datei öffne damit ich beides machen kann ohne zwei objekte zu haben.

    Indem du ein fstreamobjekt erzeugst

    std::fstream f;
    f.open("test.dat",ios::out); //zum schreiben öffnen
    f<<"labern";
    f.close();
    std::string inhalt;
    f.open("test.dat",ios::in); //zum lesen öffnen
    f>>inhalt;
    f.close();
    


  • Wurstinator schrieb:

    So, wie ich die Frage verstehe, hilft dir das hier:
    http://www.cplusplus.com/reference/iostream/ostream/seekp/

    Ja das ist so etwas...nur nicht das richtige. da ich in eine bestimmte zeile muss, mit dieser funktion jedoch wissen muss wie viele zeichen ich vor oder zurück muss..
    Ich suche eine möglichkeit nach einer bestimmten zeile etwas einzufügen, so dass der rest der alten datei noch genauso wie vorher ist. Gibt es denn da keine möglichkeit ?



  • stalker schrieb:

    Indem du ein fstreamobjekt erzeugst

    std::fstream f;
    f.open("test.dat",ios::out); //zum schreiben öffnen
    f<<"labern";
    f.close();
    std::string inhalt;
    f.open("test.dat",ios::in); //zum lesen öffnen
    f>>inhalt;
    f.close();
    

    vielen dank, damit wär diese frage schon mal geklärt 🙂



  • void eintragen()
    {	string monat;
    	struct eingabe
    	{
    		string datum;
    		string von;
    		string bis;
    		string pause;
    	}einfuegen;
    
            cout << "In welchem Monat möchten Sie etwas eintragen?"<<endl;
    	cout << "Monat--> ";
    	cin	>>monat;
    	monat="c:/Protokoll/"+monat+".txt";
    	cout <<endl<<endl;
    
    	fstream datei;
    
    	datei.open(monat.c_str(), ios_base::in | ios_base::out | ios_base::app);
    
    	int i=1;
    	while(!datei.eof())
    	{
    		datei.getline(eingelesen,100);
    		cout<<"Z"<<i<<"|"<<eingelesen<<endl;
    		++i;
    	}
    	datei.close();
    	int ZN;
    	cout<<endl<<"In welcher Zeile möchten sie etwas einfügen?"<<endl;
    	cin >>ZN; 
    	cout<<"Geben Sie das Datum ein: "; 
    	cin>>einfuegen.datum;
    	cout<<endl<<"Geben Sie den Zeitpunkt des Beginns der Arbeit ein: ";
    	cin>>einfuegen.von;
    	cout<<endl<<"Geben Sie den Zeitpunkt des Endes der Arbeit ein: ";
    	cin >>einfuegen.bis;
    	cout<<endl<<"Geben Sie den Zeitpunkt der Pause ein: ";
    	cin>>einfuegen.pause;
    
    	datei.open(monat.c_str(),ios_base::out |ios_base::app);
    
    	datei<<einfuegen.von;
    	datei.close();
    
    cin.get();
    cin.get();
    }
    

    So, also nachdem ich jetzt weiter stunden an einem anderen Problem saß, dachte ich frag ich hier nochmal nach.
    Also ich habe gemerkt das es das was ich einlesen lasse nicht in der datei speichert wenn ich diese zuvor schonmal geöffnet habe.
    also wenn ich das auslesen vorher aus dem quellcode rauskommentiere wird es unten an die datei gehängt. ansonsten nicht? warum ist das so ?
    kann man eine datei nur einmal öffnen oder wie muss ich das verstehen?



  • ich glaub euch nicht das ihr mir da nicht helfen könnt 😉



  • Da hast du gerade einen Spezialfall der Streaming-Klassen erwischt.

    Durch das 2. Öffnen (mit derselben Streaming-Instanz) werden die Fehlerflags (z.B. EOF) nicht zurückgesetzt, so daß bspw. dein Einfügen dann keine Wirkung zeigt.
    Lösung wäre entweder ein

    datei.close();
    datei.clear(); // alle Flags löschen
    

    Besser wäre jedoch du teilst deine bisherige Funktion in mehrere kleinere auf (mit jeweils einer eigenen Streaming-Instanz)!



  • Hast du den Quelltext bei dir schon getestet?

    Was passiert, wenn noch keine Datei mit dem gewünschten Namen existiert?

    Dann wie Th69 schon schrieb => kleinere Funktionen.

    Brauchst du die Zeilen 48 + 49 😕 schadet nicht - ist für mich lästig 😉

    Eventuell in deinen Unterlagen nachsehen ob du da noch eine weitere

    getline
    

    Variante findest?

    Du weisst das du an die Datei nur anhängst? Einfügen, da wirst du mehr Quelltext schreiben müssen.

    MfG f.-th.



  • f.-th. schrieb:

    Hast du den Quelltext bei dir schon getestet?

    Was passiert, wenn noch keine Datei mit dem gewünschten Namen existiert?

    Dann wie Th69 schon schrieb => kleinere Funktionen.

    Brauchst du die Zeilen 48 + 49 😕 schadet nicht - ist für mich lästig 😉

    Eventuell in deinen Unterlagen nachsehen ob du da noch eine weitere

    getline
    

    Variante findest?

    Du weisst das du an die Datei nur anhängst? Einfügen, da wirst du mehr Quelltext schreiben müssen.

    MfG f.-th.

    also die zeilen 48 und 49 benötige ich damit das programm and er stelle anhält. wenn ich da nur einmal cin.get(); stehen habe bleibt das program komischer weise nicht stehen sondern geht einfach weiter...wenn ich es allerdings so wie da doppelt habe muss man einmal enter drücken damit es weiter geht...mein compiler nimmt das sonst nciht war irgendwie...

    zu dem problem...da ich keine ahnung habe habe ich es jetzt so umgeschrieben das man immer nur eine zeile unten anhängt... mit dem code von th69 habe ich das auch geschaft,dass es funktioneirt....allerdings wäre mir das einfügen lieber, jedoch habe ich keine ahnung bin ja auch noch anfänger und programmiere erst seit vlt 14 tagen 😕
    gibt es denn eine möglichkeit mit dem einfügen ?
    danke erstmal an die die mir bereits geholfen haben 🙂


Anmelden zum Antworten