Brauche Hilfe zur Musterlösung unseres Lehrers
-
Hallo Community,
habe eine Musterlösung zu einer Aufgabe, bei der ich teilweise nicht weiß - was das Programm da tut. Meine Kenntnisse in C++ sind sagen wir... ausbaufähig. :S
Der Quelltext: (Die Fragen die ich habe stehen drin)
#include <conio.h> //Deklariert verschiedene Funktionen, die für den
//Aufruf der Textbildschirm-Ein-/Ausgabe-Routinen des
//Betriebssystems verwendet werden.
//[clreol();getch();clrscr()]#include <fstream.h> //Deklariert die C++ Stream-Klassen, die die
//Ein- und Ausgabe in/aus eine/r Datei unterstützen.
//[cout;lesen;speicher]#include <string.h> //Definiert die String-Klassen. [string;strstr]
#include <stdio.h> //Definiert Typen und Makros, die für die Standardein-
//bzw. -ausgabe (definiert durch Kernighan und Ritchie
//und erweitert unter UNIX System V) benötigt werden.
//Definiert die vordefinierten Streams der Standard-I/O
//[stdin, stdout, stdprn undstderr]und deklariert die
//Ein-/Ausgabe-Routinen auf Streamebene. [remove;rename]
#include <dir.h> //Enthält Strukturen, Makros und Funktionen zur Arbeit
//mit Verzeichnissen und Pfadangaben.[mkdir]
#include <stdlib.h> //Deklariert verschiedene allgemein verwendete Routinen
//wie Umwandlungsroutinen und Such- bzw. Sortierroutinen.
//[itoa, atoi ....]class personal
{
private:
char name[31], vorname[31], tnr[31], gebdat[12];
char strasse[31], hausnr[31], ausbildung[31], funktion[31];
char persnrtxt[7], suchwort[31];
int persnr, plz, schulnr, zaehler;public:
char verzeichnis[100], datei[200], datei_l[200];
char datei_k[200], j_n, zeile[256];
int anzahl;personal();
int speichern();
int lesen();
int suchen();
int zaehlen();
int loeschen();
int gehezu();
int aendern();};
//Konstruktor
personal::personal()
{ //Frage 1: mit getcwd kann ich das Verzeichnis ermitteln in
//dem gearbeitet wird, und der schreibt das hier in die char Variable
// verzeichnis die 100 Zeichen aufnehmen kann??
getcwd(verzeichnis,100);
strcpy(datei,strcat(verzeichnis,"\\personal.txt"));
//Frage 2: mit strcpy kann ich eine Datei kopieren? Was passiert hier
// genau wird vom ermittelten Pfad eine leere personal.txt geschrieben,
//oder?? Was passiert da noch?
getcwd(verzeichnis,100);
strcpy(datei_l,strcat(verzeichnis,"\\personal.alt"));
getcwd(verzeichnis,100);
strcpy(datei_k,strcat(verzeichnis,"\\kopie.tmp"));
}//Daten in personal.txt speichern
int personal::speichern()
{
char anfang[2];
zaehlen();
gehezu();
persnr=atoi(persnrtxt);
if(persnr<1000)
persnr=1000;
ofstream speicher;
speicher.open(datei,ios::app);
do
{
persnr++;
cout << "Geben Sie bitte Ihre Adresse ein:\n";
cin.getline(anfang,2);
cout << "Vorname: ", cin.getline(vorname,31);
cout << "Name: ", cin.getline(name,31);
cout << "Telefon-Nr: ",cin.getline(tnr,31);
speicher<<persnr<<";"<<name<<";"<<vorname<<";"<<tnr<< endl;
cout << "Weitere Adresse eingeben J/N ",clreol(), cin>>j_n;
}while(j_n=='J'||j_n=='j');
speicher.close();
return 0;
}//Anzahl Datensätze bestimmen
int personal::zaehlen()
{
ifstream lesen;
lesen.open(datei,ios::in);
anzahl = 0;
if (!lesen) //Frage 3: Wofür steht das !lesen?
{
return 0;
}
else
{
while(!lesen.eof())
{
lesen.getline(zeile,256,'\n');
anzahl++;
}
}
lesen.close();
anzahl--;
return 0;
}//Daten auf dem Bildschirm einzeln ausgeben
int personal::lesen()
{
int zeile;
clrscr();
ifstream lesen;
lesen.open(datei,ios::in);
zaehlen();
zaehler = 1;
zeile = 2;while(zaehler <= anzahl)
{
lesen.getline(persnrtxt,31,';');
lesen.getline(name,31,';');
lesen.getline(vorname,31,';');
lesen.getline(tnr,31,'\n');
gotoxy(2,zeile),cout<<persnrtxt;
gotoxy(7,zeile),cout<<name;
gotoxy(23,zeile),cout<<vorname;
gotoxy(42,zeile),cout<<tnr;
zeile++;
zaehler++;
getch();
}
lesen.close();
return 0;
}int personal::gehezu()
{
zaehler = 1;
ifstream lesen;
lesen.open(datei,ios::in);
while(zaehler <= anzahl)
{
lesen.getline(persnrtxt,7,';');
lesen.getline(zeile,256,'\n');
zaehler++;
}
lesen.close();
return 0;
}// Daten anhand eines Suchwortes finden
int personal::suchen()
{
zaehler = 0;
ifstream lesen;
lesen.open(datei,ios::in);
cout << "Geben Sie den Suchtext ein: ",clreol(), cin >> suchwort;
while (!lesen.eof())
{
lesen.getline(zeile,255,'\n');if (strstr(zeile,suchwort)!=0)
{
zaehler++;
clreol(),cout << endl,
clreol(),cout <<zeile<<endl;
}
}
cout << endl;
cout << zaehler << " Adresse(n) gefunden";
lesen.close();
getch();
return 0;
}//Datensatz löschen
int personal::loeschen()
{
remove(datei_l);
ifstream lesen;
lesen.open(datei,ios::in);
cout << "Geben Sie die Personalnummer ein: ",clreol(), cin >> suchwort;
//Kopier Datei wird erstellt
ofstream kopiere;
kopiere.open(datei_k,ios::out);
do
{
lesen.getline(zeile,255,'\n');
if (strstr(zeile,suchwort)==0 && strlen(zeile) > 4)
{
kopiere << zeile << endl;
}
}while(!lesen.eof());
kopiere.close();
lesen.close();
rename(datei,datei_l);
rename(datei_k,datei);return 0;
}//Datensatz ändern
int personal::aendern()
{
int auswahl;
zaehlen();
remove(datei_l);
ifstream lesen;
lesen.open(datei,ios::in);
cout << "Geben Sie den Suchbegriff ein: ",clreol(), cin >> suchwort;
//Kopier Datei wird erstellt
ofstream kopiere;
kopiere.open(datei_k,ios::out);
do
{
lesen.getline(persnrtxt,31,';');
lesen.getline(name,31,';');
lesen.getline(vorname,31,';');
lesen.getline(tnr,31,'\n');
if (strstr(persnrtxt,suchwort)==0 && strstr(name,suchwort)==0 && strstr(vorname,suchwort)==0 && strstr(tnr,suchwort)== 0 || strlen(persnrtxt) < 4)
{
}
else
{
cout<<"Personalnummer: "<<persnrtxt<<endl;
cout<<"Was wollen Sie ändern?"<<endl;
cout<<"1-Vorname: "<<vorname<<endl;
cout<<"2-Name: "<<name<<endl;
cout<<"3-Telefonnummer: "<<tnr<<endl;
cout<<"4-Keine Änderung "<<endl;
cout<<"Auswahl: ";cin>>auswahl;
switch(auswahl)
{
case 1:cout<<"Vorname: "<<vorname<<"Neu ";cin>>vorname;break;
case 2:cout<<"Name: "<<name<<"Neu ";cin>>name;break;
case 3:cout<<"Telefonnr: "<<tnr<<"Neu ";cin>>tnr;break;
default:break;
}
}
kopiere<<persnrtxt<<";"<<name<<";"<<vorname<<";"<<tnr<< endl;
zaehler++;
}while(strlen(persnrtxt) > 4);
kopiere.close();
lesen.close();
rename(datei,datei_l);
rename(datei_k,datei);return 0;
}int main()
{
int auswahl;
personal person;do
{
clrscr();
cout << "\n1 - Neue Adresse(n) eingeben ";
cout << "\n2 - Adressen auflisten ";
cout << "\n3 - Adresse suchen";
cout << "\n4 - Adresse löschen";
cout << "\n5 - Adresse ändern";
cout << "\n9 - Programm beenden ";
cout << "\nAuswahl = ";clreol();cin >> auswahl;switch (auswahl)
{
case 1: person.speichern(); break;
case 2: person.lesen();break;
case 3: person.suchen();break;
case 4: person.loeschen();break;
case 5: person.aendern();break;
}
}while (auswahl >0&&auswahl<8);
return 0;
}Würde mich sehr freuen, wenn sich jemand die Zeit nimmt um mir die Fragen zu beantworten. Alleine fürs durchschauen bis hierhin schon einmal Danke!
-
Benutz bitte Cpp Tags.
Dann lese ich es mir durch.
-
#include <conio.h> //Deklariert verschiedene Funktionen, die für den //Aufruf der Textbildschirm-Ein-/Ausgabe-Routinen des //Betriebssystems verwendet werden. //[clreol();getch();clrscr()] #include <fstream.h> //Deklariert die C++ Stream-Klassen, die die //Ein- und Ausgabe in/aus eine/r Datei unterstützen. //[cout;lesen;speicher] #include <string.h> //Definiert die String-Klassen. [string;strstr] #include <stdio.h> //Definiert Typen und Makros, die für die Standardein- //bzw. -ausgabe (definiert durch Kernighan und Ritchie //und erweitert unter UNIX System V) benötigt werden. //Definiert die vordefinierten Streams der Standard-I/O //[stdin, stdout, stdprn undstderr]und deklariert die //Ein-/Ausgabe-Routinen auf Streamebene. [remove;rename] #include <dir.h> //Enthält Strukturen, Makros und Funktionen zur Arbeit //mit Verzeichnissen und Pfadangaben.[mkdir] #include <stdlib.h> //Deklariert verschiedene allgemein verwendete Routinen //wie Umwandlungsroutinen und Such- bzw. Sortierroutinen. //[itoa, atoi ....] class personal { private: char name[31], vorname[31], tnr[31], gebdat[12]; char strasse[31], hausnr[31], ausbildung[31], funktion[31]; char persnrtxt[7], suchwort[31]; int persnr, plz, schulnr, zaehler; public: char verzeichnis[100], datei[200], datei_l[200]; char datei_k[200], j_n, zeile[256]; int anzahl; personal(); int speichern(); int lesen(); int suchen(); int zaehlen(); int loeschen(); int gehezu(); int aendern(); }; //Konstruktor personal::personal() { // :confused: Frage 1: mit getcwd kann ich das Verzeichnis ermitteln in //dem gearbeitet wird, und der schreibt das hier in die char Variable // verzeichnis die 100 Zeichen aufnehmen kann?? getcwd(verzeichnis,100); strcpy(datei,strcat(verzeichnis,"\\personal.txt")); // :confused: Frage 2: mit strcpy kann ich eine Datei kopieren? Was passiert hier // genau wird vom ermittelten Pfad eine lehre personal.txt geschrieben, //oder?? Was passiert da noch? getcwd(verzeichnis,100); strcpy(datei_l,strcat(verzeichnis,"\\personal.alt")); getcwd(verzeichnis,100); strcpy(datei_k,strcat(verzeichnis,"\\kopie.tmp")); } //Daten in personal.txt speichern int personal::speichern() { char anfang[2]; zaehlen(); gehezu(); persnr=atoi(persnrtxt); if(persnr<1000) persnr=1000; ofstream speicher; speicher.open(datei,ios::app); do { persnr++; cout << "Geben Sie bitte Ihre Adresse ein:\n"; cin.getline(anfang,2); cout << "Vorname: ", cin.getline(vorname,31); cout << "Name: ", cin.getline(name,31); cout << "Telefon-Nr: ",cin.getline(tnr,31); speicher<<persnr<<";"<<name<<";"<<vorname<<";"<<tnr<< endl; cout << "Weitere Adresse eingeben J/N ",clreol(), cin>>j_n; }while(j_n=='J'||j_n=='j'); speicher.close(); return 0; } //Anzahl Datensätze bestimmen int personal::zaehlen() { ifstream lesen; lesen.open(datei,ios::in); anzahl = 0; if (!lesen) // :confused: Frage 3: Wofür steht das !lesen? { return 0; } else { while(!lesen.eof()) { lesen.getline(zeile,256,'\n'); anzahl++; } } lesen.close(); anzahl--; return 0; } //Daten auf dem Bildschirm einzeln ausgeben int personal::lesen() { int zeile; clrscr(); ifstream lesen; lesen.open(datei,ios::in); zaehlen(); zaehler = 1; zeile = 2; while(zaehler <= anzahl) { lesen.getline(persnrtxt,31,';'); lesen.getline(name,31,';'); lesen.getline(vorname,31,';'); lesen.getline(tnr,31,'\n'); gotoxy(2,zeile),cout<<persnrtxt; gotoxy(7,zeile),cout<<name; gotoxy(23,zeile),cout<<vorname; gotoxy(42,zeile),cout<<tnr; zeile++; zaehler++; getch(); } lesen.close(); return 0; } int personal::gehezu() { zaehler = 1; ifstream lesen; lesen.open(datei,ios::in); while(zaehler <= anzahl) { lesen.getline(persnrtxt,7,';'); lesen.getline(zeile,256,'\n'); zaehler++; } lesen.close(); return 0; } // Daten anhand eines Suchwortes finden int personal::suchen() { zaehler = 0; ifstream lesen; lesen.open(datei,ios::in); cout << "Geben Sie den Suchtext ein: ",clreol(), cin >> suchwort; while (!lesen.eof()) { lesen.getline(zeile,255,'\n'); if (strstr(zeile,suchwort)!=0) { zaehler++; clreol(),cout << endl, clreol(),cout <<zeile<<endl; } } cout << endl; cout << zaehler << " Adresse(n) gefunden"; lesen.close(); getch(); return 0; } //Datensatz löschen int personal::loeschen() { remove(datei_l); ifstream lesen; lesen.open(datei,ios::in); cout << "Geben Sie die Personalnummer ein: ",clreol(), cin >> suchwort; //Kopier Datei wird erstellt ofstream kopiere; kopiere.open(datei_k,ios::out); do { lesen.getline(zeile,255,'\n'); if (strstr(zeile,suchwort)==0 && strlen(zeile) > 4) { kopiere << zeile << endl; } }while(!lesen.eof()); kopiere.close(); lesen.close(); rename(datei,datei_l); rename(datei_k,datei); return 0; } //Datensatz ändern int personal::aendern() { int auswahl; zaehlen(); remove(datei_l); ifstream lesen; lesen.open(datei,ios::in); cout << "Geben Sie den Suchbegriff ein: ",clreol(), cin >> suchwort; //Kopier Datei wird erstellt ofstream kopiere; kopiere.open(datei_k,ios::out); do { lesen.getline(persnrtxt,31,';'); lesen.getline(name,31,';'); lesen.getline(vorname,31,';'); lesen.getline(tnr,31,'\n'); if (strstr(persnrtxt,suchwort)==0 && strstr(name,suchwort)==0 && strstr(vorname,suchwort)==0 && strstr(tnr,suchwort)== 0 || strlen(persnrtxt) < 4) { } else { cout<<"Personalnummer: "<<persnrtxt<<endl; cout<<"Was wollen Sie ändern?"<<endl; cout<<"1-Vorname: "<<vorname<<endl; cout<<"2-Name: "<<name<<endl; cout<<"3-Telefonnummer: "<<tnr<<endl; cout<<"4-Keine Änderung "<<endl; cout<<"Auswahl: ";cin>>auswahl; switch(auswahl) { case 1:cout<<"Vorname: "<<vorname<<"Neu ";cin>>vorname;break; case 2:cout<<"Name: "<<name<<"Neu ";cin>>name;break; case 3:cout<<"Telefonnr: "<<tnr<<"Neu ";cin>>tnr;break; default:break; } } kopiere<<persnrtxt<<";"<<name<<";"<<vorname<<";"<<tnr<< endl; zaehler++; }while(strlen(persnrtxt) > 4); kopiere.close(); lesen.close(); rename(datei,datei_l); rename(datei_k,datei); return 0; } int main() { int auswahl; personal person; do { clrscr(); cout << "\n1 - Neue Adresse(n) eingeben "; cout << "\n2 - Adressen auflisten "; cout << "\n3 - Adresse suchen"; cout << "\n4 - Adresse löschen"; cout << "\n5 - Adresse ändern"; cout << "\n9 - Programm beenden "; cout << "\nAuswahl = ";clreol();cin >> auswahl; switch (auswahl) { case 1: person.speichern(); break; case 2: person.lesen();break; case 3: person.suchen();break; case 4: person.loeschen();break; case 5: person.aendern();break; } }while (auswahl >0&&auswahl<8); return 0; }
-
ok, nx mal weiß ich bescheit, sorry...
-
Frage 1: Richtig. Du sagst der Funktion, sie soll maximal 100 Zeichen schreiben, sonst würde ein Buffer-Overflow entstehen.
Frage 2:
An diesem Beispiel:strcpy(datei_l,strcat(verzeichnis,"\\personal.alt"));
Mit strcat() fügst du zwei Strings aneinander. Danach kopierst du den generierten String in die Variable "datei_1".
Frage 3: Das Ausrufezeichen negiert den boolschen Wert "lesen". Damit wird darüber entschieden, ob das Öffnen der Datei erfolgreich war.
-
Vielen Lieben Dank für die schnelle Antwort!
Zu der zweiten Antwort habe ich aber leider noch mal eine Frage: Es wird also bei strcpy(datei_l,strcat(verzeichnis,"\\personal.alt")) die beiden Pfadangaben einmal aus der Varialble verzeichnis und einmal die direkt angegebene in die Variable datei_l geschrieben, und was macht dann das strcpy? Tut mir leid, falls das eine blöde Frage sein sollte.. :S
-
Nochmal von vorne:
// <- parm 1 -> <--------- parm 2 ---------------> strcpy( datei_l , strcat(verzeichnis,"\\personal.alt") );
Sehen wir uns erstmal strcpy() an:
http://cplusplus.com/reference/clibrary/cstring/strcpy.html
Der String in parm 2 wird also ganz einfach in parm 1 kopiert.In parm 2 steht aber wieder ein Funktionsaufruf, strcat():
http://cplusplus.com/reference/clibrary/cstring/strcat.html
strcat() fügt zwei Strings zusammen, es fügt den Inhalt des
zweiten Parameters ans Ende des Ersten an. Der Rückgabewert
ist wieder ein Zeiger auf den ersten Parameter, also verzeichnis.Deshalb wird bei strcpy verzeichnis in datei_1 kopiert.
In Verzeichnis steht der ursprüngliche Wert + "\\personal.alt".
-
ist pfennigweise gefallen, aber gefallen. vielen lieben dank!
-
Wenn das C++ ist, warum dann die includes so?
#include <*.h>
Seit wann heißt es string.h, fstream.h, etc.?
-
Das sind die C header dateien. Nach dem Iso Standard müsste es heisen:
#include <cconio> #include <cfstream> #include <cstring> #include <cstdio> #include <cdir> #include <cstdlib>
Der Grund warum man die alten Header Dateien noch benutzen kann, ist Kompabilität.
shizzo
-
wir porgrammieren im Unterricht mit Borland C++ vers. 4.52. Obwohl wir da C++ und nicht C Programmieren, will derr Compiler eine Headerdatei ohne .h nicht. ???