Datensatz ausgeben
-
hallo
Problem 1:
ich habe eine Datei teilnehmer die wie folgt aussiehtHans, Müller, kurs;
Max, Meier, kurs;
u.s.w.1.Frage:
Wie kann ich alle Namen und Vornamen anzeigen lassen zum beispiel so:
Hans |Müller
Max |Meier
u.s.w.
2.Frage:
Wie kann ich die Namen nach Alphabet ordnen (ich habe das was von vector gehört???)Problem 2:
Wie kann ich zb "Max Meier" aus der Datei löschen??
-
bibstudent258 schrieb:
hallo
Problem 1:
ich habe eine Datei teilnehmer die wie folgt aussiehtHans, Müller, kurs;
Max, Meier, kurs;
u.s.w.1.Frage:
Wie kann ich alle Namen und Vornamen anzeigen lassen zum beispiel so:
Hans |Müller
Max |Meier
u.s.w.Datei zeilenweise einlesen (z.B. mit ifstream) und anhand des Komma zerlegen (std::string bietet da Methoden)
2.Frage:
Wie kann ich die Namen nach Alphabet ordnen (ich habe das was von vector gehört???)Alle Namen in eine Datenstruktur packen (Array, std::vector etc) und dann per sort() aus der STL sortieren
Problem 2:
Wie kann ich zb "Max Meier" aus der Datei löschen??z.B. die komplette Datei in einen vector einlesen, den entsprechenden Eintrag löschen und dann die Datei mit dem vector-Inhalt überschreiben.
-
kannst du mir konkrete beispiele zeigen
-
Wenn jemand ne Idee hat wie man das zum laufen bekommt sollte der rest eigentlich funktionieren.
#include <iostream.h> // Struktur für teilnehmer struct teilnehmer { char vorname[30]; char nachname[30]; char kurs[30]; teilnehmer* next; teilnehmer* last; }; // Zeiger auf den Anfang der liste teilnehmer* anfang; // Zeiger auf ende der Liste teilnehmer* ende; // hilfszeiger zum wandern teilnehmer* hilfszeiger; //Initialisieren der Liste void init(){ char inivorname[30]; char ininachname[30]; char inikurs[30]; anfang=new(teilnehmer); anfang->next = NULL; anfang->last = NULL; cout << "Bitte geben Sie den Vornamen des ersten Kursteilnehmers an: "<< endl; cin >> inivorname; strcpy(anfang->vorname,inivorname); cout << "Bitte geben Sie jetzt den Nachnamen an: " << endl; cin >> ininachname; strcpy(anfang->nachname,ininachname); cout << "Jetzt bitte noch die Kursbezeichnung: " << endl; cin >> inikurs; strcpy(anfang->kurs,inikurs); } // Funktion zum einfuegen neuer Teilnehmer void einfuegen(){ char neuvorname[30], neunachname[30], neukurs[30]; hilfszeiger = anfang; while(hilfszeiger->next != NULL) { hilfszeiger = hilfszeiger->next; } // neuer Teilnehmer hilfszeiger->next = new(teilnehmer); hilfszeiger->next->last= hilfszeiger; // hilfszeiger auf das neue Listenelement hilfszeiger = hilfszeiger->next; // Daten ins neue Element eintragen cout << "Bitte geben Sie den Vornamen des Kursteilnehmers an: "<< endl; cin >> neuvorname; strcpy(hilfszeiger->vorname,neuvorname); cout << "Bitte geben Sie jetzt den Nachnamen an: " << endl; cin >> neunachname; strcpy(hilfszeiger->nachname,neunachname); cout << "Jetzt bitte noch die Kursbezeichnung: " << endl; cin >> neukurs; strcpy(hilfszeiger->kurs,neukurs); hilfszeiger->next = NULL; ende=hilfszeiger; } void anzeigen(){ // hilfszeiger auf ersten Teiilnehmer hilfszeiger= anfang; cout << hilfszeiger->vorname << " " << hilfszeiger->nachname << " " << hilfszeiger->kurs << endl; while (hilfszeiger->next != NULL) { // nächstes Element hilfszeiger= hilfszeiger->next; cout <<hilfszeiger->vorname << " " << hilfszeiger->nachname << " " << hilfszeiger->kurs << endl; } } void loeschenalles(){ while (anfang != NULL){ hilfszeiger = anfang; anfang = anfang->next; delete(hilfszeiger); } } void loescheneinzeln(){ hilfszeiger = anfang; char loeschennachname[30]; cout << " Bitte geben Sie den Nachnamen des Teilnehmers ein der geloescht werden soll: " << endl; cin >> loeschennachname; while (hilfszeiger->nachname != loeschennachname){ hilfszeiger= hilfszeiger->next; } hilfszeiger->next->last = hilfszeiger->last; hilfszeiger->last->next = hilfszeiger->next; delete(hilfszeiger); } void main(){ char eingabe; init(); do{ cout << "Was moechten Sie als naechstes tun?" <<endl << endl; cout << "Druecken Sie a zum erfassen eines neuen Teilnehmers!" << endl; cout << "Druecken Sie b um sich alle Teilnehmer anzeigen zu lassen!" << endl; cout << "Oder c um einzelne Teilnehmer zu loeschen," << endl; cout << "oder d um alle Teilnehmer zu loeschen! " << endl; cout << "Druecken Sie e um das Programm zu beenden!" << endl << endl; cin >> eingabe; switch(eingabe){ case 'a': void einfuegen(); break; case 'b': void anzeigen(); break; case 'c': void loescheneinzeln(); break; case 'd': void loeschenalles(); break; } }while(eingabe != 'e'); loeschenalles(); char p[50]; cin.getline(p,50); }
PS: Hatte ein bissl langeweile und wollte ein bissl ueben.
-
Einfach das void vor dem Funktionsaufruf wegnehmen.
Ich depp.Jetzt ,uss ich noch das mit dem einzelnen loeschen und gucken. Da bibts noch nen Fehler und dann eine sortierfunktion versuchen reinzusetzen...beim anzeigen.
Vielleicht kann ja noch jemand mithelfen oder Tipps geben.
-
Ja warum packst du denn nicht alles in einen Vector?
// this is untested code #include <iostream> #include <algorithm> #include <string> using namespace std; struct Datensatz { string vorname; string nachname; string kurs; bool operator <(const Datensatz& rhs) { return nachname < rhs.nachname; // je nach deinem Sortierungswunsch } // bitte korrigieren!!! // den will ich überladen, damit ich nachher alles mit '<<' in einen stream kriege! const char* operator <<() { string out = vorname + "," + nachname + "," + kurs; return out.c_str(); } // ist es überhaupt OK, wenn man eine Struktur so vergewaltigt? // Ab wann nimmt man denn eine Klasse? // "Erst", wenn ich sicherstellen will, dass die Daten nicht einfach // manipuliert werden dürfen, sondern nur durch bestimmt Methoden , oder?? }; typedef vector<Datensatz> box; typedef box::iterator boxIter; int main() { box Liste; ifstream file("Daten.txt", ios::in); if(!file.is_open()) return 0; // gibt's diese Methode? string Zeile = file.read_line(); Datensatz dummySatz; while(!Zeile.empty()) { // std::string bietet bestimmt was Schönes dafür dummySatz.vorname = Zeile.XXX; dummySatz.nachname = Zeile.XXX; dummySatz.kurs = Zeile.XXX; Liste.push_back(dummySatz); string Zeile = file.read_line(); } // so, alles aus der Datei ist im vector drinne. file.close(); sort(dummySatz.begin(), dummySatz.end()); ofstream file("Daten.txt", ios::truncate); if(file.is_open()) { for(boxIter it = Liste.begin(); it != Liste.end(); ++it) file << (*it) << endl; file.close(); } awaiting_critics(); // hehe return 0; }
Wie schon oben angedeutet: Das ist ungetesteter Code.
-
Dein Code ist ... naja
Dein operator<< ist natürlich unbrauchbar. Der muss außerhalb der Klasse definiert werden und nen ostream& zurückgeben.
Zu dem struct: Ein struct ist exakt das selbe wie eine Klasse, abgesehen von kleinen Details (bei structs ist z.B. der default-Zugriffsschutz public, bei Klassen private und die Default-Ableitungsart ist unterschiedlich).
Der restliche Code ist schon fast PseudocodePS: Falls du die Datensätze nach verschiedenen Kritieren sortieren willst (mal nach den Namen, mal nach dem Vornamen etc) kannst du dir verschiedene functor schreiben und diese an sort() übergeben.
-
interpreter schrieb:
Dein Code ist ... naja
Was passt denn (sonst) nicht)
interpreter schrieb:
Dein operator<< ist natürlich unbrauchbar. Der muss außerhalb der Klasse definiert werden und nen ostream& zurückgeben.
Zu dem struct: Ein struct ist exakt das selbe wie eine Klasse, abgesehen von kleinen Details (bei structs ist z.B. der default-Zugriffsschutz public, bei Klassen private und die Default-Ableitungsart ist unterschiedlich).Könntest du das mal bitte in Code fassen. Ich kann mir den nicht so recht vorstellen.
interpreter schrieb:
Der restliche Code ist schon fast Pseudocode
Findest du?
interpreter schrieb:
PS: Falls du die Datensätze nach verschiedenen Kritieren sortieren willst (mal nach den Namen, mal nach dem Vornamen etc) kannst du dir verschiedene functor schreiben und diese an sort() übergeben.
stimmt!