-= *["]Mr.Coffee["]* =- Geschrieben 28. Februar 2002 Geschrieben 28. Februar 2002 Hab ein kleines Prog geschrieben das Adressdaten in eine Datei schreibt und diese später auch wieder einliest. Klappt soweit auch ganz gut, will es jetzt aber dahingehend verändern dass ich auch einzelne daten aufrufen kann. z.B. nur die Daten der 2.Person. Wollte es eigentlich so machen das die Stelle direkt aus der txt gesucht wird. Da dies aber nicht so einfach möglich war, hab ich mich entschlossen den string nach dem kompletten einlesen so aufzuteilen das ich den abschnitt habe den ich brauche. Verwirklichen wollte ich dies indem ich die Funktionen bis1 = name.find(';'); und name.substr(0, bis1); verwendet habe: void adresse ::lesen_datei() { cout << "Ihre Daten werden nun eingelesen" << endl; ifstream dat_ein; dat_ein.open(dateiname.c_str(), ios::in); if (!dat_ein) { cout << " Sorry, die Datei konnte nicht geöffnet werden" << endl; } char zeichen; ///* while (!dat_ein.eof()) { dat_ein.get(zeichen); //alternativ //dat_ein >> zeichen; //cout << zeichen; bis1 = zeichen.find(';'); cout << zeichen.substr(0, bis1) << endl; } fragt mich bitte nicht warum ich char zeichen hier definiert habe, und nicht in der klasse adressen. Wenn ich zeichen in der klasse definiere, findet er es nicht. warum auch immer. so funktioniert wenigstens die komplette ausgabe von zeichen cout << zeichen. wenn ich das proggi so ausführ wie es jetzt ist gibt er mir folgenden fehler aus: Der linke Teil von '.find' muss eine Klasse/Struktur/Union sein Der linke Teil von '.substr' muss eine Klasse/Struktur/Union sein is ja auch irgendwie logisch, aber wenn ich zeichen in der classe definier, geht es auch nciht. hat einer von euch da ne lösung? Zitieren
Klotzkopp Geschrieben 28. Februar 2002 Geschrieben 28. Februar 2002 Die Frage ist nicht, wo Du deklarierst, sondern was. Der fundamentale Datentyp char hat keine Memberfunktionen. find und substr sind Member der Template-Klasse std::basic_string. Zitieren
Crush Geschrieben 28. Februar 2002 Geschrieben 28. Februar 2002 Ein einzelnes Zeichen ist leider wirklich ein wenig zu klein für eine ganze Kette... Zitieren
Poldi Geschrieben 28. Februar 2002 Geschrieben 28. Februar 2002 Hallo, ich nehme mal an, daß eine zeile deiner datei ungefähr so aufgebaut ist: name;adresse;telefon;...; an den x-ten datensatz kommst du einfach über die zeilennummer. wenn du nach nem bestimmten datensatz suchen willst, splitte die eingelesene zeile einfach am trennzeichen ";" (das geht zum beispiel mit strtok) und vergleiche den string mit dem suchbegriff. ich hoffe mal das hilft ... Zitieren
-= *["]Mr.Coffee["]* =- Geschrieben 13. März 2002 Autor Geschrieben 13. März 2002 mmh irgendwie klappts immernoch nicht. @poldi: ja genau so hab ich mir das vorgestellt. die frage ist nur: wie setz ichs um? kannst du mir mal ein beispiel nennen? Gruß Jonny Zitieren
Poldi Geschrieben 13. März 2002 Geschrieben 13. März 2002 jo kann ich ... ich speicher die einzelnen substrings in einem Vektoren ab ... ein Vektor ist sowas ähnliches wie ein Array. dann kannst du im anschluß an die split funktion direkt auf die substrings über die indizes des vektoren zugreifen. beispiel: string: das;ist;jetzt;mal ein beispiel; string; vektor: vektor[0]= "das" vektor[1]= "ist" vektor[2]= "jetzt" vektor[3]= "mal ein beispiel" vektor[4]= "string" ich hab das so gemacht: ------------------------------------------------------------------------------------ // Funktion: split // Beschreibung: Der übergebene String wird immer bis zum // Trennzeichen gelesen. Der bis dahin eingelesene // Substring wird an das Ende des Vektors gehängt. // Dann wird weiter bis zum Trennzeichen gelesen. // Diese Prozedur wiederholt sich bis zum Ende des // übergebenen Strings. Am Ende wird ein Vektor // zurückgegeben, der die Substrings des übergebenen // Strings in der Reihenfolge des auftretens // beinhaltet. // Parameter: string zeile (der zu splittende string) // char trenner (das zeichen, an dem gesplittet // werden soll) // Rückgabewerte: gibt einen Vektoren vom Typen string zurück vector<string> split(string zeile, char trenner) { // Variablen int str_laenge = 0; int i = 0; string sub = ""; vector<string> schlumpf; // --- str_laenge = zeile.size(); // Substrings werden eingelesen und gespeichert for (i=0;i<str_laenge;i++) { if (zeile != trenner) { sub += zeile; } else { schlumpf.push_back(sub); sub = ""; } } schlumpf.push_back(sub); // (gefüllter) Vektor wird zurückgegeben. return schlumpf; }; // SPLIT ende // ----------------------------------------------- ------------------------------------------------------------------------------------ Zitieren
-= *["]Mr.Coffee["]* =- Geschrieben 20. März 2002 Autor Geschrieben 20. März 2002 Ok hab mal versucht das so zu machen wie du mir das gesagt hast, allerdings erkennt er weder split noch push_back. Hab ich den Code falsch umgesetzt oder ne include vergessen die ich brauch? #include <iostream> #include <fstream> #include <iomanip> using namespace std; void main() { // Funktion: split // Beschreibung: Der übergebene String wird immer bis zum // Trennzeichen gelesen. Der bis dahin eingelesene // Substring wird an das Ende des Vektors gehängt. // Dann wird weiter bis zum Trennzeichen gelesen. // Diese Prozedur wiederholt sich bis zum Ende des // übergebenen Strings. Am Ende wird ein Vektor // zurückgegeben, der die Substrings des übergebenen // Strings in der Reihenfolge des auftretens // beinhaltet. // Parameter: string zeile (der zu splittende string) // char trenner (das zeichen, an dem gesplittet // werden soll) // Rückgabewerte: gibt einen Vektoren vom Typen string zurück string zeile; zeile = "das,ist,jetzt,ma ein beispiel, string"; string vector[5]; /* vector[0]= "das"; vector[1]= "ist"; vector[2]= "jetzt"; vector[3]= "mal ein beispiel"; vector[4]= "string"; */ char trenner; trenner = ","; // vector<string> split(string zeile, char trenner) vector; split(zeile, trenner); { // Variablen int str_laenge = 0; int i = 0; string sub = ""; //vector<string> schlumpf; vector schlumpf; // --- str_laenge = zeile.size(); // Substrings werden eingelesen und gespeichert for (i=0;i<str_laenge;i++) { if (zeile != trenner) { sub += zeile; } else { schlumpf.push_back(sub); sub = ""; } } schlumpf.push_back(sub); // (gefüllter) Vektor wird zurückgegeben. return schlumpf; }; // SPLIT ende // } Zitieren
Poldi Geschrieben 21. März 2002 Geschrieben 21. März 2002 falsch: char trenner; trenner = ","; richtig: char trenner; trenner = ','; Zitieren
Poldi Geschrieben 21. März 2002 Geschrieben 21. März 2002 falsch: vector; split(zeile, trenner); richtig: vector = split(zeile, trenner); -------------------------------- falsch: string vector[5]; richtig: vector<string> meinVektor; -------------------------------- falsch: vector schlumpf; richtig: vector<string> schlumpf; -------------------------------- und die split funktion mußt du schon als unterfunktion deklarieren sonst mußt du das umbasteln. Zitieren
Alexander Weipprecht Geschrieben 22. März 2002 Geschrieben 22. März 2002 Hab auch kürzlich eine Adressverwaltung programmiert. Könnt ihr mir mal sagen wie ihr sie vom Aufbau und der übersichtlichkeit findet. Bin noch im ersten Lehrjahr, also erwartet nicht so viel: Bitte um eure Meinung: Projekt11 Unter [C / C++] | [C / C++ Tools] | [ Tools ( Adressen ) ] Würde mich über eine Antwort freuen. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.