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 mittelscin.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 sowhile(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!
