Datei auslesen
-
Hallo Leute
Ich hab ein grosses Problem.
Mein Programm das ich zusammengeschustert habe liebt mich nicht.
Ich kann zwar Weine anlegen und Anzeigen,aber sobald ich aus dem Programm aus und wieder einsteige ist alles weg.
Es muss am einlesen in die Datei in den Statischen Speicher was zu tun haben.Ich weiss mittlerweile das man so ein Programm heute anders schreibt, aber wir verwenden den alten Borland 5.02.
Den neuen Programmstil im Kurs nicht soweit besprochen.#include <iostream.h> #include <iomanip.h> #include <fstream.h> #include <string.h> #include <conio.h> #include <stdio.h> #include <stdlib.h> #include <dos.h> //Definition der Funktionstasten #define F1 1 #define F2 2 #define F3 3 #define F4 4 #define F5 5 #define F6 6 #define F7 7 #define F8 8 #define F9 9 #define F10 10 #define EINZUGMENU 15 #define EINZUGTEXT 15 //Globale Datendefinitionen const short MAXCHAR = 40; const int MAXWEINE = 5; // Struktur für Datum format struct datum { int tag; int monat; int jahr; }; // Struktur für Informationen der SWeine struct SWein { char art[MAXCHAR]; //Zeichenkette für Wein art int stueckzahl; int wnr; // Wein NR. char name[MAXCHAR]; // Wein Namen char jahrgang[MAXCHAR]; // Wein Jahrgang char herkunftsland[MAXCHAR]; // Wein Herkunftsland char einlagerungsdatei; // Wein Einlagerungsdatum datum datum; double preis; // Wein Preis }; //Funktionsdeklarationen int menu(); void weinErfassen(SWein sammlung[], int &aktAnz); void weinAnzeigen(SWein sammlung[], int aktAnz); void weinAendern(SWein sammlung[], int aktAnz); void weinAusbuchen(SWein sammlung[], int &aktAnz); //Hilfsfunktionen int fileRead(char* strfile, const SWein* meineweine, int &anz); int fileSave(char* strfile, SWein* meineweine, int anz); int fkt_taste(); // Hauptprogramm int main() { //Statischer Speicher fuer MAXWEINE struct SWein sammlung[MAXWEINE]; int aktAnz = 0, auswahl; //Daten aus Datei einlesen fileRead("weindaten.dat",sammlung,aktAnz); do{ auswahl = menu(); switch(auswahl){ case F10: //Anwendung beenden clrscr(); fileSave("weindaten.dat",sammlung, aktAnz++); cout << "happy trails..."; sleep(1); break; case F1: //Daten Weine erfassen cout << endl << aktAnz; getch(); weinErfassen(sammlung,aktAnz); break; case F2: //Daten aller Weine anzeigen weinAnzeigen(sammlung, aktAnz); break; case F3: //Weine suchen und aendern anhand eines kriteriums weinAendern(sammlung,aktAnz); break; case F4: //Weine ausbuchen weinAusbuchen(sammlung, aktAnz); break; case F5: //Eingegebene Daten Sichern clrscr(); fileSave("weindaten.dat",sammlung, aktAnz); break; default: //Alle anderen Faelle break; } }while(auswahl != F10); return(0); } //Funktionsdefinitionen //Hauptfunktionen //Menufunktione gibt Menue aus und liest Auswahl des Benutzers ein und gibt diese //als int zuerueck int menu(){ //Lokale Daten char auswahl; do{ clrscr(); cout.setf(ios::right,ios::adjustfield); cout << setw(EINZUGMENU) << "" << "Menue Weinverwaltung\n\n\n"; cout << setw(EINZUGMENU) << "F 1" << "\tWeine erfassen" << endl << endl; cout << setw(EINZUGMENU) << "F 2" << "\tWeine anzeigen" << endl << endl; cout << setw(EINZUGMENU) << "F 3" << "\tWeine aendern" << endl << endl; cout << setw(EINZUGMENU) << "F 4" << "\tWeine ausbuchen" << endl << endl; cout << setw(EINZUGMENU) << "F 5" << "\tEingegebene Daten Sichern" << endl << endl; cout << setw(EINZUGMENU) << "F10" << "\tBeenden" << endl << endl; //Bedienung ueber Funktionstasten F1 - F10, fuer F1 bekommt man 1 zuerueck usw. auswahl = fkt_taste(); }while(auswahl < F1 || auswahl > F10); return auswahl; } //Funktionsdefinitionen (Implementierungen) void weinErfassen(SWein sammlung[], int &aktAnz) { char x; clrscr(); cout.setf(ios::right,ios::adjustfield); do { cout << "Weinnummer eingeben > " ; cin >> sammlung[aktAnz].wnr; if (sammlung[aktAnz].wnr==0) return; cout << "Vorhandene Stueckzahl eingeben > " ; cin >> sammlung[aktAnz].stueckzahl; cout << "Wein-Art(Rotwein, Weisswein) > "; cin >> sammlung[aktAnz].art; cout << "Name (ohne Zwischenraeume) > "; cin >> sammlung[aktAnz].name; cout << "Jahrgang (jjjj) > "; cin >> sammlung[aktAnz].jahrgang; cout << "Herkunftsland > "; cin >> sammlung[aktAnz].herkunftsland; cout << "Einlagerungsdatum(tt mm jj) > "; cin >> sammlung[aktAnz].datum.tag >>sammlung[aktAnz].datum.monat >> sammlung[aktAnz].datum.jahr; cout << "Preis (Euro) > "; cin >> sammlung[aktAnz].preis; aktAnz++; cout<<"Wollen Sie weitermachen? Ja/Nein: "; cin >> x; }while(x!='n'); clrscr(); return; } void weinAnzeigen(SWein sammlung[], int aktAnz) { clrscr(); cout.setf(ios::right,ios::adjustfield); cout<<"===================================================\n\n"; for(int i = 0; i < aktAnz; i++) { cout << "SWeinnummer: " << sammlung[i].wnr << endl; cout << "Vorhandene Stueckzahl: " << sammlung[i].stueckzahl<< endl; cout << "Art: " << sammlung[i].art << endl; cout << "Name: " << sammlung[i].name << endl; cout << "Jahrgang: " << sammlung[i].jahrgang << endl; cout << "Herkunftsland: " << sammlung[i].herkunftsland << endl; cout << "Einlagerungsdatum: " << sammlung[i].datum.tag << "." << sammlung[i].datum.monat << "." << sammlung[i].datum.jahr << endl; cout << "Preis: " << sammlung[i].preis << endl << endl; cout << "-----------------------------\n"; } cout<<"Weiter mit beliebiger Taste..."; getch(); clrscr(); return; } void weinAendern(SWein sammlung[], int aktAnz) { clrscr(); cout.setf(ios::right,ios::adjustfield); for(int i = 0; i < aktAnz; i++) { cout<<"Bitte gesuchte SWeinnummer eingeben: "; cin>>i; if(sammlung[i].wnr==i); { cout << "Vorhandene Stueckzahl: \t\t\t" << sammlung[i].stueckzahl<< endl; cout << "Art:\t\t\t" << sammlung[i].art <<"\n"; cout << "Name:\t\t\t" << sammlung[i].name <<"\n"; cout << "Jahrgang:\t\t" << sammlung[i].jahrgang <<"\n"; cout << "Herkunftsland:\t\t" << sammlung[i].herkunftsland <<"\n"; cout << "Einlagerungsdatum:\t" << sammlung[i].datum.tag << "." << sammlung[i].datum.monat << "." << sammlung[i].datum.jahr <<"\n"; cout << "Preis:\t\t\t" << sammlung[i].preis << "\n"; } while(i != 'n') cout << "Wollen Sie weiter suchen? Ja/Nein: "; cin >> i; } cout<<"\nWeiter mit beliebiger Taste..."; getch(); clrscr(); return; } void weinAusbuchen(SWein sammlung[], int &aktAnz) { char x; int i, anz; clrscr(); cout.setf(ios::right,ios::adjustfield); do { clrscr(); cout << "Bitte gesuchte Weinnummer eingeben: "; cin >> x; //Suche Index im Array des Weines mit der Weinnummer x for(i = 0;x == sammlung[i].wnr; i++); cout << "Wieviele Falschen moechten sie ausbuchen > "; cin >> anz ; if(sammlung[i].stueckzahl < anz) { cout << "Ihre Buchhaltung stimmt nicht, es sind nicht mehr soviele Flaschen vorhanden"; getch(); } else if(sammlung[i].stueckzahl == anz) { //Was mache ich, wenn dies zutrifft?? Loesche ich den Wein kplt. oder nur stueckzahl auf 0?? cout << "\nWollen Sie den Eintrag loeschen? Ja/Nein: "; //cout<<"\nWollen Sie den Eintrag loeschen? Ja/Nein: "; cin >> x; //cin >> x; } else if(sammlung[i].stueckzahl > anz) sammlung[i].stueckzahl = sammlung[i].stueckzahl - anz; cout << "Wollen Sie weitere Weine ausbuchen? Ja/Nein: "; cin >> x; }while(x != 'n'); getch(); clrscr(); return; } //Hilfsfunktionen //fileRead liest Datei ein und alloziert dynamisch Speicher fuer alle Elemente und liest Sie ein int fileRead(char* strfile, const SWein* meineweine, int &anz){ //Inputfilestream - Objekt, quasi Pointer auf die Dateien ifstream dat_ein; //Eingabedatei oeffnen dat_ein.open( strfile, ios::in||ios::binary); //Check ob's funktioniert hat if (!dat_ein){ cerr << "Datei konnte nicht geoeffnet werden!\n"; return 1; } //1. Anzahl Elemente in Datei zaehlen anz = dat_ein.gcount() / sizeof(struct SWein); //Strukturen einlesen for(int i = 0; i < anz; i++){ dat_ein.read((char *) &meineweine[i],sizeof(struct SWein)); } //File unbedingt schliessen nach Gebrauch dat_ein.close(); return 0; } //fileSave speichert Daten eines Arrays in eine Datei, welche per Parameter uebergeben werden int fileSave(char* strfile, SWein* meineweine, int anz){ //Outputfilestream - Objekt, quasi Pointer auf die Dateien ofstream dat_aus; // Ausgabedatei oeffnen dat_aus.open(strfile, ios::out||ios::binary); //Check ob's funktioniert hat if (!dat_aus){ cerr << "Datei konnte nicht geoeffnet werden!\n"; return 1; } // Array mit Strukturen binaer in Datei schreiben dat_aus.write((char *)meineweine, sizeof(struct SWein)*MAXWEINE); //File unbedingt schliessen nach Gebrauch dat_aus.close(); return 0; } //Erkennen der Funktionstaste int fkt_taste() /* Erkennung der Funktionstasten F1...F10 */ { int Nummer=20; /* Nummer der Taste */ char ch=0; /* Charakter der Taste */ do{ do {} while (!kbhit()); /* Auf Tastendruck warten */ ch = getch(); if ((ch==0) && (kbhit)){ ch = getch(); Nummer = ch-58; /* ch = #0 => Fkt-Taste allgemein */ } /* Nummer der Funtionstaste ermitteln */ }while ((Nummer<1) || (Nummer>10)); /* solange bis Fkt-Taste F01 bis F10 */ return Nummer; };
Wäre für jede Hilfe dankbar.
Gruss tinile
Bitte Code-Tags verwenden
-
sorry, aber benutze bitte code-tags!
glaube nicht das sich das ganze so jemand anschaut!
-
Hallo,
formatier den Quelltext erst einmal mit Hilfe der cpp-Tags. Das ist so ueberhaupt
nicht uebersichtlich.Desweiteren waere es gut, wenn du erstmal nur den Code postest, der deiner
Meinung nach nicht korrekt arbeitet. Stellt sich dieser als korrekt dar, kann
man immernoch weitere Teile posten. Ein ganzes Programm zu posten hat immer sowas
von "Hier habt ihr meinen Quelltext, nun macht ihr mal" und dagegen straeube ich
mich irgendwie.mfg
v R
-
http://www.c-plusplus.net/forum/viewtopic-var-t-is-129186-and-start-is-0.html
Wo kriegt man eine Weinverwaltung als Haufaufgabe?
-
Sorry Leute
Kann mir einer miteilen wie man den cpp-tags anwendet? (C/C++,Code,Quote)???Es ist keine Hausaufgabe.Ist ein Kursabschlussprojekt.
Ich weiss leider nicht welcher Bereich richtig arbeitet.
Gruss
Tinile
-
tinile schrieb:
Sorry Leute
Kann mir einer miteilen wie man den cpp-tags anwendet? (C/C++,Code,Quote)???Ja. Unsere Forum FAQ:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-39411.html
-
HumeSikkins
Vielen Dank für Deinen Hinweis.
-
Für was den eine for schleife beim weinAnzeigen?
Habe nicht so einen alten Boreland zum compellieren installiert.
Las mal die schleife weg.
-
Salü
Ich bin mir nicht sich ob der Befehl zum "Datei aus der Datei einzulesen" richtig ist. fileRead("weindaten.dat",sammlung,aktAnz);
Die Funktion Anzeigen findet nichts.//Hilfsfunktionen int fileRead(char* strfile, const SWein* meineweine, int &anz); int fileSave(char* strfile, SWein* meineweine, int anz); int fkt_taste(); // Hauptprogramm int main() { //Statischer Speicher fuer MAXWEINE struct SWein sammlung[MAXWEINE]; int aktAnz = 0, auswahl; //Daten aus Datei einlesen fileRead("weindaten.dat",sammlung,aktAnz);
Kann mir einer einen Tip geben?
Gruss Tinile
-
tinile schrieb:
Die Funktion Anzeigen findet nichts.
Du meinst wenn man auf Anzeigen im Hauptmenü "klickt"?? Bei mir klappt das und die Weine werden angezeigt.
mfg.
-
Salü joomoo
Auch wenn du das Programm schliest und wieder startest??
Die Daten werden schon in der Datei gespeichert(weindaten.dat).Aber beim Neustart findet er sie nicht.
Könnte es an meinem compiler liegen?
Gruss tinile
-
tinile schrieb:
Salü joomoo
Auch wenn du das Programm schliest und wieder startest??
Die Daten werden schon in der Datei gespeichert(weindaten.dat).Aber beim Neustart findet er sie nicht.
Könnte es an meinem compiler liegen?
Gruss tinile
Stimmt, bei mir werden die daten auch nicht richtig gelesen.
Folgende Zeile:
anz = dat_ein.gcount() / sizeof(struct SWein);
gcount() gibt dir nicht die größe der Datei, sondern wieviel Bytes du mit dem letztem input gelsesen hast. Also musst die anz Variable am besten auch noch in der Datei speichern.
mfg.
-
Salü
Hab endeckt das ich zum teil anz mit aktAnz verwechselt habe.
Wie und wo füge ich das anz in die Datei an???
Danke und Gruss Tinile
-
Vielleicht mit einem Code?
-
tinile schrieb:
Salü
Hab endeckt das ich zum teil anz mit aktAnz verwechselt habe.
Wie und wo füge ich das anz in die Datei an???
Danke und Gruss Tinile
Die ersten vier byte sollten die int Variable speichern. Danach folgt die Struktur.
mfg.
-
Hallo
Die ersten vier byte sollten die int Variable speichern. Danach folgt die Struktur.
Vertsteh irgendwie nur Bahnhof.
Wenn ich das anz dem dat_ein.gcount() zuweise?
Kannst du mir ein beispiel zeigen?
Gruss tinile
-
Du musst die Variable aktAnz speichern.
Das sieht dann so aus in der Funktion fileSave:dat_aus.write(reinterpret_cast<char*>(&anz),sizeof(int));
Danach schreibst du die Struktur.
Beim einlesen (fileRead) liest du dann auch zuerst einen int ein:dat_ein.read(reinterpret_cast<char*>(&anz),sizeof(int));
Und danach die Struktur.
Klappt bei mir dann einwandfrei.
mfg.
-
Vielen Dank joomoo
Habe den Code eingefügt.Beim Test zeigt er mir aber zahlen (binär?).
Hat es bei Dir alles richtig angezeigt?
Muss ich den Code "anz = dat_ein.gcount() / sizeof(struct SWein);" vielleicht
entfernen?
Vielleicht habe ich ihn falsch eingefügt.//Hilfsfunktionen //fileRead liest Datei ein und alloziert dynamisch Speicher fuer alle Elemente und liest Sie ein int fileRead(char* strfile, const SWein* meineweine, int &anz){ //Inputfilestream - Objekt, quasi Pointer auf die Dateien ifstream dat_ein; //Eingabedatei oeffnen dat_ein.open( strfile, ios::in||ios::binary); //Check ob's funktioniert hat if (!dat_ein){ cerr << "Datei konnte nicht geoeffnet werden!\n"; return 1; } //1. Anzahl Elemente in Datei zaehlen anz = dat_ein.gcount() / sizeof(struct SWein); dat_ein.read( reinterpret_cast<char*>(&anz),sizeof(int)); //Strukturen einlesen for(int i = 0; i < anz; i++){ dat_ein.read((char *) &meineweine[i],sizeof(struct SWein)); } //File unbedingt schliessen nach Gebrauch dat_ein.close(); return 0;
-
Hast du es auch in der fileSave eingefügt?
Bei mir hat's geklappt. Versuch mal vorher die alte Datei (weindaten.dat) zu löschen.
Die alte Zeile ist sinnlos, nimm sie am besten raus, aber das sollte nicht das Problem sein.
mfg.
-
Vielen Dank
Jetzt klappt es.Du hast mir dabei sehr geholfen.
Wieder ein Problem weniger.
Jetzt gehts an die Schuchfunktion im wein Aendern.Hab sie ein wenig umgebaut.Zwar nicht sehr fachmänisch aber sie geht halbwegs.
Es gibt nur ein Problem.Wenn ich den Wein mit der Nummer 2 suche zeigt er mir den Wein Nummer 3 an.void weinAendern(SWein sammlung[], int aktAnz) { clrscr(); char x; int i; for(i = 0; i < aktAnz; i++) { cout<<"Bitte gesuchte SWeinnummer eingeben: "; cin >> i; if(sammlung[i].wnr==i); { cout << "SWeinnummer:\t\t" << sammlung[i].wnr <<"\n"; cout << "Art:\t\t\t" << sammlung[i].art <<"\n"; cout << "Name:\t\t\t" << sammlung[i].name <<"\n"; cout << "Jahrgang:\t\t" << sammlung[i].jahrgang <<"\n"; cout << "Herkunftsland:\t\t" << sammlung[i].herkunftsland <<"\n"; cout << "Einlagerungsdatum:\t" << sammlung[i].datum.tag << "." << sammlung[i].datum.monat << "." << sammlung[i].datum.jahr <<"\n"; cout << "Preis:\t\t\t" << sammlung[i].preis << "\n"; cout<<"--------------------------------------------------\n"; cout << "Vorhandene Stueckzahl:\t" << sammlung[i].stueckzahl<<"\n\n"; cout << "Wollen Sie den Lagerstand veraendern? Ja/Nein: "; cin >> x; if(x=='j') { cout << "Alter Lagerstand: " << sammlung[i].stueckzahl<<endl; cout << "Neuer Lagerstand eingeben: "; cin >> sammlung[i].stueckzahl; cout << "Neuer Lagerstand: " << sammlung[i].stueckzahl<<endl; } cout << "Wollen Sie weiter suchen? Ja/Nein: "; cin >> x; }while(x != 'n'); cout << "\nWeiter mit beliebiger Taste..."; } getch(); clrscr(); return; }
Habt ihr vielleicht einen Tip zum Löschen eines ganze Weineintrages?
Wird eher nicht gehen.Vermutlich nur überschreiben.
Gibt es eine Möglichkeit dem Wein automatisch eine Nummer zu geben??