Veröffentlicht 28. Februar 200223 j 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?
28. Februar 200223 j 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.
28. Februar 200223 j Ein einzelnes Zeichen ist leider wirklich ein wenig zu klein für eine ganze Kette...
28. Februar 200223 j 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 ...
13. März 200223 j 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
13. März 200223 j 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 // ----------------------------------------------- ------------------------------------------------------------------------------------
20. März 200223 j 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 // }
21. März 200223 j 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.
22. März 200223 j 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.
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.