Zum Inhalt springen

aufteilen eines Strings


-= *["]Mr.Coffee["]* =-

Empfohlene Beiträge

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 ...

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 Wochen später...

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

// -----------------------------------------------

------------------------------------------------------------------------------------

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

//

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...