Zeilenweise einlesen



  • Hallo,
    ich möchte mir ein Programm schreiben, welches mir zeilenweise nach eingabe von ENTER die Zeilen einließt und dann wieder in die DOS- Box hinausschreibt, es soll aber nicht möglich sein, 2 gleiche Zeilen einzugeben,
    ich möchte also alle Zeilen in einer Collection speichern,

    Welche Collection verwende ich da am Besten und wie könnte so ein Programm aussehen?

    Vielen Dank für die Antworten,

    lg



  • Simpel wäre da ein std::vector, da dort "beliebig" viel rein kann. Der Aufwand steigt natürlich mit jeder Zeile, wenn man schaut ob die Zeile schon einmal vorkam.



  • such dir am besten eine, die keine Duplikate zulässt - erster Tip: std::setstd::string. (wenn dir wichtig ist, daß die Daten in der Reihenfolge ausgegeben werden, in der sie reingekommen sind, nimm einen vector<string> und such selber nach Duplikaten)

    PS: Einlesen kannst du deine Zeilen mit getline().



  • Wenn es sich um sehr viele Zeilen handelt und dir Performanz wichtig ist, solltest du dir Hashing anschauen und dann über den großen vector sozusagen in über den Hashvalue referenzierbare Listen aufteilen. Das verringert den Aufwand enorm. Aber auch dabei geht dir die Reihenfolge verloren.



  • Die Reihenfolge ist mir eigentlich egal,
    ich möchte die Zeile eh gleich wieder ausgeben, nachdem ich diese eingelesen und in einem Vector oder einem Set gespeichert habe,

    Dann ist wohl ein Set das beste, da dieser keine gleichen Einträge erlaubt, oder?

    lg und vielen Dank,



  • Sollte es eigentlich - wobei von der Geschwindigkeit ein Hash-Set besser wäre (gibt's u.a. bei Boost oder in der TR1)



  • Hallo,

    ich hab mal ein Programm geschrieben, aber ich weiß nicht, wie ich das mit dem Set machen kann,
    Könnte mir wer helfen bzw. einen Ansatz schreiben,

    Vielen Dank,

    lg

    #include "stdafx.h"
    #include <iostream>
    using namespace std;
    
    class ReadWrite {
    public:
    	ReadWrite();
    	~ReadWrite();
    	void readwrite();
    private:
    	set<string> vecRead; 
    };
    
    ReadWrite::ReadWrite()
    {
    }
    
    ReadWrite::~ReadWrite()
    {
    }
    
    void ReadWrite::readwrite()
    {
    for(;;)
    	{
    		cout << "Bitte eine Zeile eingeben: \n" << endl;
    		//cin >> vecRead;
    		cout << "Das wurde eingegeben: " << endl;
    	}
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	ReadWrite readwrite;
    	getchar();
    	return 0;
    }
    


  • Hat da jemand eine Idee, wie ich das am Besten machen kann?



  • prinzipiell etwas so:

    string input;
    getline(cin,input);//du willst zeilenweise einlesen, also per getline
    if(vecRead.find(input)==vecRead.end())
    {
      //Zeile war noch nicht in der Liste
      cout<<input<<endl;//Ausgabe
      vecRead.insert(input);
    }
    else
    {
      //Zeile war bereits eingelesen
      cout<<"--- FEHLER ---\n"
    }
    

    (und das Hauptprogramm sollte deine Methode natürlich auch verwenden)

    PS: Und tu dir selber (bzw. deinen Nutzern) einen Gefallen und bau eine Abbruchbedingung ein



  • Das sowieso, bei einer Endlosschleife gehört immer eine Abbruchbedingung rein oder eben (Strg+C), :->
    Vielen Dank,

    lg


Log in to reply