Startprobleme
-
Hallo erst mal
Mein Programm läuft unter Menuepunkt 1 und 4 aber 2 und 3 funktinieren nicht.
Bei 2 läuft eine kurze Anzeige der Eingaben aber die Anzeige bleibt nicht konstant. Bei drei funktioniert garnichts, könnte mir vielleicht jemand helfen bitte. es geht darum die Adressen eines Vereines zu bearbeiten.
Hier mein Programm
.h muss sein#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
//#define BIL clrscr()
//--------------------------------------------------void menue(); //Funktion für Menue
void oeffnen();
void ausgabe();
void eingabe();
void speichern();
void aendern();int i=0,j; // Laufvariable
int auswahl=1; // AuswahlvariableFILE *Datei;
//---------------------------------------------------
struct Programm
{
int mgnr; //Mitgliedsnummer
char nvn[20]; //Nachname-Vorname
char str[20]; //Strasse
int plz; //Postleitzahl
char ort[15]; //Ort
int etj; //Eintrittsjahr
}
STRUKT[100];
//---------------------------------------------------
void Menue()
{
cout
<<"Mitgliederverwaltung\n\n"
<<"1.Datensatz Eingeben"<<endl
<<"2.Datensatz Ausgeben"<<endl
<<"3.Datensatz Bearbeiten"<<endl
<<"4.Programm beenden"<<endl
<<"Wählen sie bitte aus ! : ";
cin>>auswahl;switch(auswahl)
{
case 1 : eingabe();
break;
case 2 : oeffnen();
break;
case 3 : aendern();
break;
case 4 : cout<<"Vielen Dank für die Nutzung des Programms";
break;
default : cout<<"Fehler!";
}
}
//----------------------------------------------------------------
void eingabe() // Funktion zur Eigabe der Mitgliedsdaten
{
cout<<"Bitte geben sie den Mitgliedsnummer ein:";
cin>>STRUKT[i].mgnr;
cout<<"Bitte geben sie den Mitgliedsnamen ein:";
cin>>STRUKT[i].nvn;
cout<<"Bitte geben sie die Strasse-Hausnummer ein:";
cin>>STRUKT[i].str;
cout<<"Bitte geben sie die Postleitzahl ein:";
cin>>STRUKT[i].plz;
cout<<"Bitte geben sie den Ort ein :";
cin>>STRUKT[i].ort;
cout<<"Bitte geben sie das Eintrittsjahr ein:";
cin>>STRUKT[i].etj;speichern();
i++;
}
//------------------------------------------------------------------
void speichern()
{
Datei=fopen("C:\\Datei.txt","a");
if(Datei == NULL)
{
cout<<"Fehler beim oeffnen der Datei";
getch();
exit(1);
}else
{
fwrite(&STRUKT[i],sizeof(STRUKT[i]),1,Datei);
cout<<"Datei erfolgreich gespeichert.....Enter!";
getch();
}
fclose(Datei);
menue();
}
//-----------------------------------------------------------------
void oeffnen()
{
Datei=fopen("C:\\Datei.txt","a");
fread(&STRUKT[i],sizeof(STRUKT[i]),1,Datei);
while(!feof=(Datei))
{
cout<<"Mitgliedsnummer : \t\t"<<STRUKT[i].mgnr<<"\n";
cout<<"Nachname-Vorname: \t\t"<<STRUKT[i].nvn<<"\n";
cout<<"Strasse : \t\t"<<STRUKT[i].str<<"\n";
cout<<"Postleitzahl : \t\t"<<STRUKT[i].plz<<"\n";
cout<<"Ort : \t\t"<<STRUKT[i].ort<<"\n";
cout<<"Eintrittjahr : \t\t"<<STRUKT[i].etj<<"\n";cout<<"--------------------------------------------\n\n";
i++;
fread(&STRUKT[i],sizeof(STRUKT[i]),1,Datei);
}
fclose(Datei);
cout<<"Weiter mit.....Enter!";
getch();
menue();
}
//-----------------------------------------------------------------
void aendern()
{
char x;
int suche;Datei=fopen("C:\\Datei.txt","r+");
fread(&STRUKT[i],sizeof(STRUKT[i]),1,Datei);
do
{
fread(&STRUKT[i],sizeof(STRUKT[i]),1,Datei);
cout<<"Bitte gesuchte Mitgliedsnummer eingeben: ";cin>>suche;
if(suche==STRUKT[i].mgnr)
{cout<<"Mitgliedsnummer :\t\t"<<STRUKT[i].mgnr<<"\n";
cout<<"Nachname-Vorname:\t\t"<<STRUKT[i].nvn<<"\n";
cout<<"Strasse :\t\t"<<STRUKT[i].str<<"\n";
cout<<"Postleitzahl :\t\t"<<STRUKT[i].plz<<"\n";
cout<<"Ort :\t\t"<<STRUKT[i].ort<<"\n";
cout<<"Eintrittsjahr :\t\t"<<STRUKT[i].etj<<"\n";
fseek(Datei,(1)*sizeof(struct Programm),SEEK_SET);
fwrite(&STRUKT[i],sizeof(STRUKT[i]),1,Datei);
}
i++;
cout<<"Wollen sie weiter suchen? Ja/Nein:";
cin>>x;
}
while(x!='n');
fclose(Datei);
cout<<"\nWeiter mit beliebiger Taste...";
getch();menue();
}
//----------------------------------------------
int main()
{
//BIL;
menue();
getch();
return 0;
}
-
Gewöhne dir doch bitte an, Code-Tags zu benutzen.
Es muss auch nicht immer das ganze Programm sein.while(!feof=(Datei))
Hier hast du eine Zuweisung statt Vergleich.
-
[quote="SeppSchrot"]Gewöhne dir doch bitte an, Code-Tags zu benutzen.
Es muss auch nicht immer das ganze Programm sein.while(!feof=(Datei))
Hier hast du eine Zuweisung statt Vergleich.[/quote]
ok ich werde versuchen mich zu bessern
da ich nicht genau wusste was ich posten sollte habe das ganze Programmes geht um oeffnen und aendern die Zuweisung die du geschrieben hast steht oben in oeffnen drin also kann es das nicht sein
und wenn ich etwas in aendern an der Schleife aendere bekomme ich eine Fehler-Meldung
-
[quote="SeppSchrot"]Gewöhne dir doch bitte an, Code-Tags zu benutzen.
Es muss auch nicht immer das ganze Programm sein.while(!feof=(Datei))
Hier hast du eine Zuweisung statt Vergleich.[/quote]
ok ich werde versuchen mich zu bessern
da ich nicht genau wusste was ich posten sollte habe das ganze Programmes geht um oeffnen und aendern die Zuweisung die du geschrieben hast steht oben in oeffnen drin also kann es das nicht sein
und wenn ich etwas in aendern an der Schleife aendere bekomme ich eine Fehler-Meldung
-
hanna1 schrieb:
while(!feof=(Datei))
Sollte das nicht eher so aussehen
while (!feof(Datei))
Zudem bin ich mir nicht sicher, ob du die Datei "C:\Datei.txt" richtig einliest. Erstmal gibt es Unterschiede zwischen Binär- und Textmodus. Und zweitens müssen evtl. Werte vorher erst umgewandelt werden, zB String -> int.
-
[quote="groovemaster"][quote="hanna1"]while(!feof=(Datei))[/quote]
Sollte das nicht eher so aussehenwhile (!feof(Datei))
Zudem bin ich mir nicht sicher, ob du die Datei "C:\Datei.txt" richtig einliest. Erstmal gibt es Unterschiede zwischen Binär- und Textmodus. Und zweitens müssen evtl. Werte vorher erst umgewandelt werden, zB String -> int.[/quote]
du hast recht die Zeile muss so lauten (!feof(Datei))
Im Menue funktionieren Position 1-2- und 4 aber drei macht Probleme. Ich habe vier Persónendaten eingeben, wenn ich aber in Position-3 aendern beispielsweise die 1 eingebe zeigt er mir die Daten nicht an. Wenn ich aber die 2 eingebe zeigt er alles richtig an ich weiis nicht warum? Wenn erst etwas umgewandelt werden muss, ich weiss nicht wie und wo
Vielen Dank im voraus
-
Wenn ich dich richtig verstanden hab, dann macht folgende Funktion Probleme
void aendern() { char x; int suche; Datei=fopen("C:\\Datei.txt","r+"); fread(&STRUKT[i],sizeof(STRUKT[i]),1,Datei); do { fread(&STRUKT[i],sizeof(STRUKT[i]),1,Datei); cout<<"Bitte gesuchte Mitgliedsnummer eingeben: "; cin>>suche; if(suche==STRUKT[i].mgnr) { cout<<"Mitgliedsnummer :\t\t"<<STRUKT[i].mgnr<<"\n"; cout<<"Nachname-Vorname:\t\t"<<STRUKT[i].nvn<<"\n"; cout<<"Strasse :\t\t"<<STRUKT[i].str<<"\n"; cout<<"Postleitzahl :\t\t"<<STRUKT[i].plz<<"\n"; cout<<"Ort :\t\t"<<STRUKT[i].ort<<"\n"; cout<<"Eintrittsjahr :\t\t"<<STRUKT[i].etj<<"\n"; fseek(Datei,(1)*sizeof(struct Programm),SEEK_SET); fwrite(&STRUKT[i],sizeof(STRUKT[i]),1,Datei); } i++; cout<<"Wollen sie weiter suchen? Ja/Nein:"; cin>>x; } while(x!='n'); fclose(Datei); cout<<"\nWeiter mit beliebiger Taste..."; getch(); menue(); }
Irgendwie versteh ich deine Vorgehensweise nicht. Nach der Eingabe der Mitgliedsnummer vergleichst du die mit nur einem Datensatz. Das ist keine sinnvolle Suche. Wie wird ausserdem die Indexvariable i initialisiert. Du hast sie global gemacht. Das ist keine gute Idee, da niemand ohne weiteres nachvollziehen kann, wo und wie sie verändert wird.
-
Ist es so schwer den BB-Code zu aktivieren, wenn man schon unbedingt die Quote-Funktion benutzen will?
-
[quote="groovemaster"]Wenn ich dich richtig verstanden hab, dann macht folgende Funktion Probleme
void aendern() { char x; int suche; Datei=fopen("C:\\Datei.txt","r+"); fread(&STRUKT[i],sizeof(STRUKT[i]),1,Datei); do { fread(&STRUKT[i],sizeof(STRUKT[i]),1,Datei); cout<<"Bitte gesuchte Mitgliedsnummer eingeben: "; cin>>suche; if(suche==STRUKT[i].mgnr) { cout<<"Mitgliedsnummer :\t\t"<<STRUKT[i].mgnr<<"\n"; cout<<"Nachname-Vorname:\t\t"<<STRUKT[i].nvn<<"\n"; cout<<"Strasse :\t\t"<<STRUKT[i].str<<"\n"; cout<<"Postleitzahl :\t\t"<<STRUKT[i].plz<<"\n"; cout<<"Ort :\t\t"<<STRUKT[i].ort<<"\n"; cout<<"Eintrittsjahr :\t\t"<<STRUKT[i].etj<<"\n"; fseek(Datei,(1)*sizeof(struct Programm),SEEK_SET); fwrite(&STRUKT[i],sizeof(STRUKT[i]),1,Datei); } i++; cout<<"Wollen sie weiter suchen? Ja/Nein:"; cin>>x; } while(x!='n'); fclose(Datei); cout<<"\nWeiter mit beliebiger Taste..."; getch(); menue(); }
Irgendwie versteh ich deine Vorgehensweise nicht. Nach der Eingabe der Mitgliedsnummer vergleichst du die mit nur einem Datensatz. Das ist keine sinnvolle Suche. Wie wird ausserdem die Indexvariable i initialisiert. Du hast sie global gemacht. Das ist keine gute Idee, da niemand ohne weiteres nachvollziehen kann, wo und wie sie verändert wird.[/quote]
Könnten wir eins nach dem anderen machen. Ich habe es auch begriffen wie es mit fseek und SEEK_SET funktioniert. Fseek setzt den Positionszeiger und SEEK_SET setzt ihn an den Anfang der Datei.
Du hast recht ich muss die Zeichen wieder umwandeln, denn sie werden als Buchstaben gespeichert, mit atoi müssten sie wieder umgewandelt werden in int Zahlen. Würdest du mir bitte dabei helfen wie und wo ich das hin schreiben muss
Vielen Dank im Voraus
-
Zeig doch einfach mal, wie ein Datensatz in "C:\Datei.txt" aussieht bzw aussehen soll. Erst dann kann man sagen wie die Infos der Struktur Programm gelesen bzw geschrieben werden. Letztendlich hast du 2 Möglichkeiten. Entweder du machst das ganze 1:1. Dann wird "C:\Datei.txt" aber eher eine binäre Datei. Oder du wandelst die Infos vorher erst um. Das klingt zwar aufwendiger, ist aber dank Funktionen wie fprintf unf fscanf relativ simpel (auch wenn das alles andere als schönes C++ ist
).
-
[quote="groovemaster"]Zeig doch einfach mal, wie ein Datensatz in "C:\Datei.txt" aussieht bzw aussehen soll. Erst dann kann man sagen wie die Infos der Struktur Programm gelesen bzw geschrieben werden. Letztendlich hast du 2 Möglichkeiten. Entweder du machst das ganze 1:1. Dann wird "C:\Datei.txt" aber eher eine binäre Datei. Oder du wandelst die Infos vorher erst um. Das klingt zwar aufwendiger, ist aber dank Funktionen wie fprintf unf fscanf relativ simpel (auch wenn das alles andere als schönes C++ ist
).[/quote]
Hallo
so sieht die Datei aus warum zeigt er die Miegliedsnummer und die Postleitzahl nich anSpiekermann_Hubert Im_Wieshof_16 Tå Menden ¤ Spiekermann_Michael Im_Wieshof_16 Tå Menden » Spiekermann_Hubert Heimkerweg_29 Rå Menden ¹ Kobusch_Fred Eichendorffstrasse_1Tå Menden »
-
hanna1 schrieb:
warum zeigt er die Miegliedsnummer und die Postleitzahl nich an
Das liegt genau daran, dass es nicht umgewandelt wurde. In deiner Datei steht nunmal Text. Mitgliedsnummer, Postleitzahl und Eintrittsjahr sind im Programm aber ganzzahlige Werte.
Schreiben kannst du die Datensätze wie folgtfprintf(Datei, "%i %s %s %i %s %i", STRUKT[i].mgnr, STRUKT[i].nvn, STRUKT[i].str, STRUKT[i].plz, STRUKT[i].ort, STRUKT[i].etj);
Und lesen
fscanf(Datei, "%i %s %s %i %s %i", &STRUKT[i].mgnr, STRUKT[i].nvn, STRUKT[i].str, &STRUKT[i].plz, STRUKT[i].ort, &STRUKT[i].etj);
Dabei ist zu beachten, dass die scanf-Funktionen Strings ua nur bis zum nächsten Leerzeichen einlesen. Das sollte aber bei deinen Daten wohl keine Probleme machen.
-
[quote="groovemaster"][quote="hanna1"]warum zeigt er die Miegliedsnummer und die Postleitzahl nich an[/quote]
Das liegt genau daran, dass es nicht umgewandelt wurde. In deiner Datei steht nunmal Text. Mitgliedsnummer, Postleitzahl und Eintrittsjahr sind im Programm aber ganzzahlige Werte.
Schreiben kannst du die Datensätze wie folgtfprintf(Datei, "%i %s %s %i %s %i", STRUKT[i].mgnr, STRUKT[i].nvn, STRUKT[i].str, STRUKT[i].plz, STRUKT[i].ort, STRUKT[i].etj);
Und lesen
fscanf(Datei, "%i %s %s %i %s %i", &STRUKT[i].mgnr, STRUKT[i].nvn, STRUKT[i].str, &STRUKT[i].plz, STRUKT[i].ort, &STRUKT[i].etj);
Dabei ist zu beachten, dass die scanf-Funktionen Strings ua nur bis zum nächsten Leerzeichen einlesen. Das sollte aber bei deinen Daten wohl keine Probleme machen.[/quote]
tut mir leid ich bin wahrscheinlich noch zu dämlich muss das in aendern, oder Eingabe oder Anzeige rein oder wo? Wenn ja wie?
noch ein Problem ich muss ja wenn ich in aendern etwas aendern will den Cursor am Anfang haben.
-
fprintf schreibst du dort rein, wo die Daten in die Datei geschrieben werden sollen. Also dorthin, wo du jetzt fwrite stehen hast. fscanf ist dann fürs Lesen der Datei zuständig.
hanna1 schrieb:
noch ein Problem ich muss ja wenn ich in aendern etwas aendern will den Cursor am Anfang haben
Und das Problem wäre...
-
[quote="groovemaster"]fprintf schreibst du dort rein, wo die Daten in die Datei geschrieben werden sollen. Also dorthin, wo du jetzt fwrite stehen hast. fscanf ist dann fürs Lesen der Datei zuständig.
[quote="hanna1"]noch ein Problem ich muss ja wenn ich in aendern etwas aendern will den Cursor am Anfang haben[/quote]
Und das Problem wäre...[/quote]Das Problem mit dem Cursor wäre, wenn ich etwas ändern will müsste er auf mgnr. stehen da ich ihn ja nicht rückwärts bewegen kann.
Ich habe alles so geändert wie du gesagt hast aber es ist immer noch nicht richtig jetzt zeigt er es so an stimmt das?
0 Spiekermann_Hubert mIW_eihsfo1_6 0 Menden 00 Spiekermann_Michael mIW_eihsfo1_6 0 Menden 00 Spiekermann_Hubert eHmiekwrge2_9 0 Menden 00 Spiekermann_Klaus lAetanrets_r91 0 Iserlohn/Hemer 0
-
hanna1: Bitte, mach mal den BB-Code an! Ist das denn so schwer? Fragst du dich nicht manchmal selber, warum deine Postings so scheiße aussehen?
Warum die überhaupt noch jemand liest ist mir ein Rätsel!
-
[quote="MaSTaH"]hanna1: Bitte, mach mal den BB-Code an! Ist das denn so schwer? Fragst du dich nicht manchmal selber, warum deine Postings so scheiße aussehen?
Warum die überhaupt noch jemand liest ist mir ein Rätsel![/quote]
Wenn du dir die Mühe gemacht hättest und einwenig zurück gelesen hättest, wäre dir vielleicht aufgefallen das es darum geht, was mein Programm in die Datei schreibt, was leider falsch ist und deshalb beim auslesen falsch angezeigt wird. Und das habe ich gepostet. Diesmal war ich noch sehr höflich das nächste Mal werde dir ich ein paar Zeilen schreiben die du so schnell nicht vergisst
-
Soll ich jetzt Angst haben? Hast du überhaupt gelesen (bzw. verstanden) was ich gesagt habe? Scheinbar nicht, denn der Quote funktioniert immer noch nicht. Gehe mal bitte in dein Profil und stelle die Option "BBCode immer aktivieren:" auf Ja. Wenn du das nicht schaffst dann weiß ich auch nicht... Nach über 50 Posts sollte es dir auch aufgefallen sein, dass die Tags bei dir nicht funktionieren.
-
Btw, ersetze in groovemasters Code alle %i durch %d, dann klappts auch mit den Dateien.
-
hanna1 schrieb:
Ich habe alles so geändert wie du gesagt hast aber es ist immer noch nicht richtig jetzt zeigt er es so an stimmt das?
0 Spiekermann_Hubert mIW_eihsfo1_6 0 Menden 00 Spiekermann_Michael mIW_eihsfo1_6 0 Menden 00 Spiekermann_Hubert eHmiekwrge2_9 0 Menden 00 Spiekermann_Klaus lAetanrets_r91 0 Iserlohn/Hemer 0
Keine Ahnung ob das stimmt. Das kannst du dir nur selbst beantworten. Es sieht aber auf jedenfall schon mal besser aus als vorher. Die PLZ kannst du ja noch entsprechend formatieren, das %i zu %05i ändern. Das einzige was mir noch komisch vorkommt, sind diese Sachen
mIW_eihsfo1_6
Hiess das nicht Im_Wieshof_16? Scheint so, als wären die Bytes geswapped.