Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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?

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

  • 2 Wochen später...

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

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

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

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

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

//

}

falsch:

char trenner;

trenner = ",";

richtig:

char trenner;

trenner = ',';

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.

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.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.