Streams vergleichen



  • Hallo Leute, ich habe ein kleines Problem

    Ich schreibe gerade ein Adressenverwaltungsprogramm,
    das Prog liest die Adressen aus ner Datei aus.
    Man kann die neue Adressen hinzufügen, anzeigen ect...

    Mein Problem ist ich will jetzt eine Suchfunktion einbauen,
    wo mittels

    cin.getline(search,30,'\n');
    

    das zu suchende Wort eingelesen wird, auf der anderen Seite mit

    while(stream.eos())
    {
        cin.getline(stream,30,'|');
    }.....
    

    das Wort aus der Datei ausgelesn wird.
    Ich will jetzt das wenn search=stream ist die Adresse ausgegeben wird,
    oder in Klassen gespeichert wird...

    Ich dachte das ich einfach die beiden Zeichenketten vergleichen muss,
    also so

    while(stream.eos())
    {
        cin.getline(stream,30,'|');
    
    if(stream==search)
    {
        Gebe Daten aus, speicher Daten in Klassen usw...)
    }
    }.....
    

    ...aber es funktioniert nicht, obwohl stream und search gleich sind
    gibt die If-Bedingung nicht True zurück? 😞

    Ich bin noch Anfänger in C++ und wäre deshalb um jede Hilfe dankbar!
    Ich hab schonmal was von Zeigern in C++ gehört, ich denke das dass mein
    Programm erheblich verbessern könnte, vielleicht wisst ihr was darüber...

    mfg tillt



  • Was genau ist denn der Fehler?
    Du solltest die ganzen Adressdaten sowiso lieber im Speicher haben statt ständig Plattenzugriffe zu machen. Also, zu Beginn einmal einlesen und später die ganzen Daten wieder speichern.

    grüße



  • Erstmal danke für deine schnelle Antwort 🙂

    Klar, das klingt logisch. Aber ich bin noch relativ neu in C++ und wüßte nicht wie ich das machen könnte... 😕
    Zu den Fehler, die if Bedingung erkennt nicht das die als char deklarierten Variabeln gleich sind, auch unter char* klappt nicht?

    zur Hilfe ich benutze DevC++



  • Ich nehme an stream und search sind char-Arrays? In dem Fall kannst du den operator== vergessen, der vergleicht nur die Pointer, die auf den für die Arrays reservierten Speicherbereiche zeigen.

    Das ist noch ein weiterer von vielen Gründen, warum char* unter C++ im Allgeminen kein akzeptabler Typ für die Darstellung von Strings ist. Dafür nimmt man normalerweise std::string. Und dann klappts auch mit dem ==.



  • mit den "machen könnte" meine ich das ich ja mit ner schleife alle daten auslen müsste und diese dann in variabeln speichern müsste, soweit wäre das kein Problem, aber bei 100. von Adressen wird das schon ziemlich speicherfressend und ich hab bis jetzt noch nicht mit Speicherverwaltung ect... gearbeitet



  • Zum vergleichen von C-Strings (char 😉 muss die Funktion strcmp() verwendet werden.
    Besser wäre es jedoch gleich die C++ Veriante, nämlich std::string, zu verwenden statt alten C-Strings.

    100 Adressen sollte dein Speicher verkraften können! 😉

    grüße



  • Kannst du mir das mit den std::string mal genauer erklären...
    hab bis jetzt noch nicht damit gearbeitet wie funktioniert das?

    mfg tillt



  • Hab mal nen bisschen gegoogelt und das hier gefunden:
    http://www.hlrs.de/people/mueller/tutorials/script/scriptse30.html
    Werd mich mal ein bisschen darin einarbeiten...
    Vielen Dank für eure Antworten! 🙂

    mfg tillt



  • Hi!

    Ein kleiner Denkanstoß:

    #include <iostream>
    #include <vector>
    #include <string>
    #include <fstream>
    
    class AddressList
    {
    public:
    	struct Item
    	{
    		std::string name;
    		std::string vorname;
    
    		Item( const std::string &_name, const std::string &_vorname )
    		: name( _name ),
    		  vorname( _vorname )
    		{}
    
    		Item( std::ifstream &stream )
    		{
    			std::getline( stream, name );
    			std::getline( stream, vorname );
    		}
    	};
    
    	typedef std::vector< Item *>		item_list;
    	typedef item_list::iterator			item_list_iter;
    	typedef item_list::const_iterator	item_list_const_iterator;
    
    private:
    	item_list list;
    
    public:
    	~AddressList();
    
    	void ReadFromFile( std::ifstream &stream );
    	Item *Find( const std::string &name ) const;
    };
    
    AddressList::~AddressList()
    {
    	item_list_iter it = list.begin();
    
    	for ( ; it != list.end(); ++it )
    	{
    		delete *it;
    	}
    
    	list.clear();
    }
    
    void AddressList::ReadFromFile( std::ifstream &stream )
    {
    	while ( stream.good() )
    	{
    		AddressList::Item *new_item = new AddressList::Item( stream );
    		list.push_back( new_item );
    	}
    }
    
    AddressList::Item *AddressList::Find( const std::string &name ) const
    {
    	item_list_const_iterator it = list.begin();
    
    	for ( ; it != list.end(); ++it )
    	{
    		if ( ( *it )->name == name )
    			return *it;
    	}
    
    	return 0;
    }
    
    int main()
    {
    	AddressList list;
    	std::ifstream stream( "foobar.txt" );
    
    	if ( !stream )
    		throw std::logic_error( "cannot open stream" );
    
    	list.ReadFromFile( stream );
    	AddressList::Item *item = list.Find( "Name2 " );
    
    	if ( item )
    	{
    		std::cout << "Name: " << item->name << std::endl;
    		std::cout << "Vorname: " << item->vorname << std::endl;
    	}
    	else
    		std::cout << "Not found" << std::endl;
    
    	stream.close();
    }
    


  • Sorry das ich erst jetzt Antworte

    Vielen Dank für das Beispiel Prog, schätze werde dadurch viel lernen

    mfg tillt 🙂

    Ps: Deine Webseite hat ein gutes Design! 👍


Anmelden zum Antworten