Dateien - letzte Zeile



  • Hallo zusammen!

    Ich habe ein kleines Programm geschrieben mit dem ich Dateien anlegen will. In diesen Dateien befinden sich einige Eingaben. Ich benötige jetzt immer die letzte Zeile. Wie lässt sich die Anzahl der Zeilen im File bestimmen?

    Gruß, sole 😃



  • das hilft dir nicht viel venn du die anzahl der zeilen in einer textdatei weisst ( ausser alle zeilen sind gleich lang ). du musst sowiso alle zeilen einlesen.
    eine andere möglichkeit wäre die datei im bimärmodus zu öffnen zb die letzen 500 bytes in einen buffer zu lesen und diesen buffer dann zu analysieren.
    K.



  • Aber wenn ich die Anzahl der Zeilen wüsste, könnte ich zur letzten mit seekg(anzahl) springen und mir dann die letzte ausgeben lassen. Wieso sollte das nicht funktionieren? 😕

    Gruß, Inga. 😃



  • wie gesagt das geht nur wenn alle zeilen gleich lang sind.
    K



  • Könnte ich dann nicht die restlichen Leerzeilen mit ' ' auffüllen? Wie soll das denn dann funktionieren?



  • wenn du alle zeilen gleich lang machen kannst dann funktioniert es natürlich.
    du ermittelst die grösse der datei und dividierst durch die länge eines datensatzes und hast die anzahl.
    K



  • Das ist alles ganz schön kompliziert. Wie würde das denn gehen, wenn ich alles ausgeben lasse? Kann ich dann irgendwas abschneiden?

    Gruß, sole 🙄



  • Viel mehr kann ich dir im Moment nicht helfen. Da müsste ich schon mehr über den Aufbau deiner Datensätze ( oder Textzeilen ) wissen.
    Zeig mal was du schon hast.
    K.



  • Hier der bisherige Code:

    #include <iostream>
    #include <fstream>
    #include <string>
    
    using namespace std;
    
    int main() {
    
    	string name, vorname, strasse, ort, dateiname;
    	long plz;
    	//char ausgabe[1000];
    	string line(""); // Alle Zeichen, abgesehen von den Leerzeichen, hier speichern 
        char c; 
    
    	cout << "Kunde anlegen"<< endl;
    	cout << "Vorname?" << endl;
    	cin >> vorname;
    	cout << "Name?" << endl;
    	cin >> name;
    	cout << "Strasse?" << endl;
    	cin >> strasse;
    	cout << "PLZ?" << endl;
    	cin >> plz;
    	cout << "Wohnort?" << endl;
    	cin >> ort;
    
    	fstream datei("kunde.txt" ,  ios::out| ios::app);
    
    	datei << vorname << ' ';
    	datei << name << ' ';
    	datei << strasse << ' ';
    	datei << plz << ' ';
    	datei << ort << ' ' << endl;
    	while(datei.good()) 
            { 
                    datei.get(c); // Aktuelles Zeichen in der Variablen c speichern 
                    if(c != ' ') 
                            line += c; 
                    if(datei.eof()) // Schleife verlassen 
                            break; 
            } 
    	datei.close();
    	cout << line << endl; 
    	return 0;
    }
    

    Gruß, sole 🤡



  • dein code hat zwar nicht viel mit deiner org. frage zu tun aber trotzdem ein paar tips.

    #include <iostream>
    #include <fstream>
    #include <string>
    
    using namespace std;
    
    int main() {
    
        string name, vorname, strasse, ort, dateiname;
        long plz;
        //char ausgabe[1000];
        string line(""); // Alle Zeichen, abgesehen von den Leerzeichen, hier speichern
        char c;
    
        cout << "Kunde anlegen"<< endl;
        cout << "Vorname?" << endl;
        cin >> vorname;
        cout << "Name?" << endl;
        cin >> name;
        cout << "Strasse?" << endl;
        cin >> strasse;
        cout << "PLZ?" << endl;
        cin >> plz;
        cout << "Wohnort?" << endl;
        cin >> ort;
    
        fstream datei("kunde.txt" ,  ios::out| ios::app); // du öffnest die datei nur zum schreiben
    
        datei << vorname << ' ';
        datei << name << ' ';
        datei << strasse << ' ';
        datei << plz << ' ';
        datei << ort << ' ' << endl;
        datei.close(); //  fertig mit schreiben
        datei.open("kunde.txt" ,  ios::in); // datei zum lesen öffene
        while( !datei.eof() )
            {
                    datei.get(c); // Aktuelles Zeichen in der Variablen c speichern
                    if(c != '\n')
                            line += c;
                    else {
                        cout << line << endl;
                        line = ""; 
                    }
    		// einfacher wäre natürlich
    		// datei.getline(line);
    		// cout << line << endl;
    
            }
        datei.close();
        return 0;
    }
    

    Hoffe das hilft dir weiter.
    K



  • Ja, ich bin ja auch noch nicht sehr weit gekommen. Wenn man das Programm laufen lässt, dann funktioniert die Ausgabe nicht richtig. Weißt du woran das liegt?

    Im Anschluss vom Code möchte ich mir jetzt nämlich nur die letzte Zeile ausgeben lassen. Und da bin ich dann ja nicht weitergekommen.

    😃



  • so sollte es funktonieren

    string lastline;
        while( !datei.eof() )
            {
                    datei.get(c); // Aktuelles Zeichen in der Variablen c speichern
                    if(c != '\n')
                            line += c;
                    else {
                        //cout << line << endl;
    		    if ( line.length() )
                            lastline = line;
                        line = "";
                    }           
            }
        cout << "letzte zeile" << lastline << endl;
        datei.close();
        return 0;
    }
    


  • So würde ich das anfangen:

    #include <fstream>
    #include <iostream>
    #include <string>
    
    int main(int argc, char *argv[]) {
      std::string zeile, prev_zeile;
      std::ifstream in(argv[1]);
      int counter = 0;
    
      while(std::getline(in, zeile)) {
        prev_zeile = zeile;
        ++counter;
      }
    
      std::cout << argv[1] << " hatte " << counter << " Zeilen." << std::endl
                << "Die letzte war:" << std::endl
                << prev_zeile << std::endl;
    }
    

    Naja - genau genommen würde ich aus Performancegründen wohl eher

    #include <fstream>
    #include <iostream>
    #include <string>
    
    int main(int argc, char *argv[]) {
      std::string zeilen[2];
      std::ifstream in(argv[1]);
      int counter = 0, index = 0;
    
      while(std::getline(in, zeilen[index])) {
        index = 1 - index;
        ++counter;
      }
    
      std::cout << argv[1] << " hatte " << counter << " Zeilen." << std::endl
                << "Die letzte war:" << std::endl
                << zeilen[1 - index] << std::endl;
    }
    

    schreiben, auf die Art muss man nicht ständig eine Kopie der Zeile anlegen. Das Prinzip ist aber im Grunde das selbe.



  • Hi,

    wenn du sehr große Dateien erwartest, wird es schneller sein, einen Buffer (einige Bytes kleiner als 4096 wegen Page Size bietet sich an) anzulegen und dann zuerst die Größe der Datei ermitteln und dann von hinten immer den Buffer wieder auffüllen, bis du den CR oder LF (je nach Art der Textdatei auch beides) findest. Dann kannst du von da bis zum Ende lesen oder einfach die Buffer gleich abspeichern, rückwärts aneinander hängen und den Anfang im ersten (bzw. letztgelesenen) Buffer bis zum CR/LF abschneiden.

    ChrisM



  • Hallo zusammen!

    Das ist nun mein Code. Wenn ich den ausführe, dann klappt alles wunderbar. Er legt die Datei an und schreibt auch in die Datei rein. Allerdings kann er mir die letzte Zeile nicht ausgeben. Wer kann helfen. Hier mein vollständiges Coding.

    Gruß, sole

    #include <iostream>
    #include <fstream>
    #include <string>
    
    using namespace std;
    
    int main() {
    
    	string name, vorname, strasse, ort;
    	long plz;
    	char c;
    	string line; // Alle Zeichen, abgesehen von den Leerzeichen, hier speichern 
    
    	cout << "Kunde anlegen"<< endl;
    	cout << "Vorname?" << endl;
    	cin >> vorname;
    	cout << "Name?" << endl;
    	cin >> name;
    	cout << "Strasse?" << endl;
    	cin >> strasse;
    	cout << "PLZ?" << endl;
    	cin >> plz;
    	cout << "Wohnort?" << endl;
    	cin >> ort;
    
    	fstream datei("kunde.txt" ,  ios::out| ios::app);
    
    	datei << vorname << ';';
    	datei << name << ';';
    	datei << strasse << ';';
    	datei << plz << ';';
    	datei << ort << ';' << endl;
    	string lastline; 
        while( !datei.eof() ) 
            { 
                    datei.get(c); // Aktuelles Zeichen in der Variablen c speichern 
                    if(c != ';') 
                            line += c; 
                    else { 
                        cout << line << endl; 
                if ( line.length() ) 
                            lastline = line; 
                        line = ""; 
                    }           
            } 
        cout << "letzte zeile" << lastline << endl; 
        datei.close(); 
        return 0; 
    
    }
    

Anmelden zum Antworten