Problem mit laden-Funktion
-
Ok, die Ausgabe hat sich verändert! Ich hab 6 Werte in der Datei, bekomme auch den zweiten ausgegeben, nur leider fehlt dieses mal der erste und alles, was danach folgt...:(
-
Zur Auffrischung:
Werte in der Datei: 1 2 3 5 6 77
void laden() { char temp[19]; int i=0; clrscr(); setzefarbe(8); c_printf(2,1,"---------------------------------"); setzefarbe(4); c_printf(2,2,"Pumpensteuerung Version 7.0"); printf("\n -> Hauptmen%c", (char)129); setzefarbe(8); c_printf(2,4,"---------------------------------"); setzefarbe(7); printf("\n Welche Datei m%cchten Sie %cffnen?", (char)148, (char)148); printf("\n Bitte geben Sie den Dateinamen ein "); setzefarbe(4); printf("%c ", (char)175); setzefarbe(7); getchar(); gets(dateiname); if((stream = fopen(dateiname,"r")) == NULL) { printf("\nFehler beim Oeffnen! Weiter mit Eingabetaste!"); } else { fgets(temp,20,stream); while(NULL!=fgets(temp,20,stream)) { tabelle[i]=atoi(temp); i++; } fclose(stream); } }
-
Das ist keine Wunder
else { fgets(temp,20,stream); /* dieses fgets ist einfach zu viel, die Daten werden wie geplant zu Beginn des whiles gelesen und auf EOF geprüft */ while(NULL!=fgets(temp,20,stream)) ....
-
Oh, das hatte ich gar bedacht!
Nun stehe ich aber wieder vor dem alten Problem, dass ich nur die erste Zeile auslesen kann...
-
Wie sieht deine Ausgabefunktion aus??
Wie ist tabelle definiert?
-
Ausgabefunktion:
void anzeigen() { int i; clrscr(); setzefarbe(8); c_printf(2,1,"---------------------------------"); setzefarbe(4); c_printf(2,2,"Pumpensteuerung Version 7.0"); printf("\n -> Hauptmen%c", (char)129); setzefarbe(8); c_printf(2,4,"---------------------------------"); setzefarbe(7); printf("\n\n Es folgen nun %i Werte in %i Feldern.\n",feld+1, feld+1); for(i=0;i<=feld;i++) { printf("\n Wert f%cr Feld [%i] = %i", (char)129, i, tabelle[i]); } printf("\n\n\n\n Weiter mit Eingabetaste!"); getchar(); getchar(); }
Variablen sind wie folgt deklariert:
char wahl=0, dateiname[80]; int feld; int *tabelle= new int[feld]; FILE *stream;
Alles global, aber daran liegts auch nicht denke ich. Die Werte werden mir ja auch richtig angezeigt bevor ich die Datei speichere. Erst wenn ich versuche die Datei zu laden geht's net mehr...
-
Füg mal folgende Zeilen eine
while(NULL!=fgets(temp,20,stream)) { tabelle[i]=atoi(temp); printf("Index %i, Wert %i",i,tabelle[i]\n); /******/ i++; } fclose(stream); for(j=0;j<i;j++) /**********************************/ printf("Index %i, Wert %i",j,tabelle[j]\n); /******/
Wo füllst du die Maximalvariable feld mit der Anzahl der Elemente
-
Hmm... Damit kill ich immerhin das Prog...;)
Pass auf, ich hau mal mein ganzes Programm raus, damit auch die zusammenhänge mal klar werden:#include <stdio.h> #include <conio.h> #include <stdlib.h> #include <string.h> #include <windows.h> //include <mcatools.h> char wahl=0, dateiname[80]; int feld; int *tabelle= new int[feld]; FILE *stream; void c_printf(); void menue(); void felder(); void eingeben(); void anzeigen(); void bearbeiten(); void speichern(); void laden(); void infos(); void auswahl(); void setzefarbe(); void setzefarbe(int farbe) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), farbe); } void main() { do { menue(); auswahl(); }while(1); } c_printf(int x, int y, char text[]) { gotoxy(x,y); printf("%s",text); return(0); } void menue() { clrscr(); setzefarbe(8); c_printf(2,1,"---------------------------------"); setzefarbe(4); c_printf(2,2,"Pumpensteuerung Version 7.0"); printf("\n -> Hauptmen%c", (char)129); setzefarbe(8); c_printf(2,4,"---------------------------------"); setzefarbe(7); c_printf(4,6,"1.) Anzahl der Felder"); c_printf(4,7,"2.) Werte eingeben"); c_printf(4,8,"3.) Werte anzeigen"); c_printf(4,9,"4.) Werte bearbeiten"); c_printf(4,10,"5.) Werte speichern"); c_printf(4,11,"6.) Werte laden"); c_printf(4,13,"7.) Informationen"); c_printf(4,14,"8.) Programm beenden"); printf("\n\n\n W%chlen Sie einen Men%cpunkt ", (char)132, (char)129); setzefarbe(4); printf("%c ", (char)175); setzefarbe(7); } void felder() { int wert; clrscr(); setzefarbe(8); c_printf(2,1,"---------------------------------"); setzefarbe(4); c_printf(2,2,"Pumpensteuerung Version 7.0"); printf("\n -> Hauptmen%c", (char)129); setzefarbe(8); c_printf(2,4,"---------------------------------"); setzefarbe(7); printf("\n\n\n Bitte geben Sie die Anzahl der Felder ein "); setzefarbe(4); printf("%c ", (char)175); setzefarbe(7); scanf("%i", &wert); wert=wert-1; feld=wert; } void eingeben() { int i; clrscr(); setzefarbe(8); c_printf(2,1,"---------------------------------"); setzefarbe(4); c_printf(2,2,"Pumpensteuerung Version 7.0"); printf("\n -> Hauptmen%c", (char)129); setzefarbe(8); c_printf(2,4,"---------------------------------"); setzefarbe(7); for(i=0; i<=feld; i++) { printf("\n\n Der Wert f%cr Feld [%i] %c ",(char)129, i+1, (char)175); scanf("%i", &tabelle[i]); clrscr(); setzefarbe(8); c_printf(2,1,"---------------------------------"); setzefarbe(4); c_printf(2,2,"Pumpensteuerung Version 7.0"); printf("\n -> Hauptmen%c", (char)129); setzefarbe(8); c_printf(2,4,"---------------------------------"); setzefarbe(7); printf("\n\n Der Wert '%i' wurde erfolgreich in das Feld[%i] von %i geschrieben!", tabelle[i],i+1,feld+1); } } void anzeigen() { int i; clrscr(); setzefarbe(8); c_printf(2,1,"---------------------------------"); setzefarbe(4); c_printf(2,2,"Pumpensteuerung Version 7.0"); printf("\n -> Hauptmen%c", (char)129); setzefarbe(8); c_printf(2,4,"---------------------------------"); setzefarbe(7); printf("\n\n Es folgen nun %i Werte in %i Feldern.\n",feld+1, feld+1); for(i=0;i<=feld;i++) { printf("\n Wert f%cr Feld [%i] = %i", (char)129, i, tabelle[i]); } printf("\n\n\n\n Weiter mit Eingabetaste!"); getchar(); getchar(); } void bearbeiten() { int i; clrscr(); setzefarbe(8); c_printf(2,1,"---------------------------------"); setzefarbe(4); c_printf(2,2,"Pumpensteuerung Version 7.0"); printf("\n -> Hauptmen%c", (char)129); setzefarbe(8); c_printf(2,4,"---------------------------------"); setzefarbe(7); printf("\n\n Es folgen nun %i Werte.\n",feld+1); for(i=0; i<=feld; i++) { printf("\n Wert f%cr Feld [%i] = %i", (char)129, i, tabelle[i]); } int bearb; printf("\n\n\n Welche Zelle m%cchten Sie bearbeiten?", (char)148); printf("\n Feld[x]\n x = "); scanf("%i", &bearb); printf("\n\n Welchen neuen Wert soll die Zelle [%i] annehmen?", bearb); printf("\n Wert f%cr Feld[%i] ", (char)129, bearb); setzefarbe(4); printf("%c ", (char)175); setzefarbe(7); scanf("%i", &tabelle[bearb]); } void speichern() { int i; clrscr(); setzefarbe(8); c_printf(2,1,"---------------------------------"); setzefarbe(4); c_printf(2,2,"Pumpensteuerung Version 7.0"); printf("\n -> Hauptmen%c", (char)129); setzefarbe(8); c_printf(2,4,"---------------------------------"); setzefarbe(7); printf("\n\n\n Unter welchem Namen soll die Datei gespeichert wedern?"); printf("\n Bitte geben Sie einen Dateinamen ein "); setzefarbe(4); printf("%c ", (char)175); setzefarbe(7); getchar(); gets(dateiname); if((stream = fopen(dateiname,"w")) == NULL) { printf("\n\n\n Fehler beim %ffnen! Weiter mit Eingabetaste!", (char)153); wahl= 7; } for(i=0; i<=feld; i++) { fprintf(stream,"%i\n",tabelle[i]); } fclose(stream); printf("\n\n\n Die Datei wurde erfolgreich geschrieben."); printf("\n\ Weiter mit Eingabetaste!"); getchar(); } void laden() { char tempvar[19]; int i=0; clrscr(); setzefarbe(8); c_printf(2,1,"---------------------------------"); setzefarbe(4); c_printf(2,2,"Pumpensteuerung Version 7.0"); printf("\n -> Hauptmen%c", (char)129); setzefarbe(8); c_printf(2,4,"---------------------------------"); setzefarbe(7); printf("\n Welche Datei m%cchten Sie %cffnen?", (char)148, (char)148); printf("\n Bitte geben Sie den Dateinamen ein "); setzefarbe(4); printf("%c ", (char)175); setzefarbe(7); getchar(); gets(dateiname); if((stream = fopen(dateiname,"r")) == NULL) printf("\nFehler beim Oeffnen! Weiter mit Eingabetaste!"); else { fgets(tempvar,20,stream); /* Hier wird in die Variable tempvar * * die erste zeile als char reingeschrieben, * * es werden n-1 Zeichen gelesen (hier: n=20) */ while(!feof(stream)) /* Wiederholungsschleife, die so lange */ { /* Zeile für Zeile die Anweisungen ausführt * * bis das Ende der Datei erreicht ist */ tabelle[i]=atoi(tempvar); /* Hier wird der Wert von tempvar als integer * * in das feld tabelle[i] mit der zeilennummer i * * gespeichert */ i++; fgets(tempvar,11,stream); /* Wiederholung dessen, was schon über der Schleife * * steht, allerdings innehalb der Schleife, weil * * "oben" nur die erste der datei zeile gelesen wird */ } fclose(stream); } } void infos() { clrscr(); setzefarbe(8); c_printf(2,1,"---------------------------------"); setzefarbe(4); c_printf(2,2,"Pumpensteuerung Version 7.0"); printf("\n -> Hauptmen%c", (char)129); setzefarbe(8); c_printf(2,4,"---------------------------------"); setzefarbe(7); c_printf(4,6,"PUMPENSTEUERUNG.EXE"); c_printf(4,7,"Verzweifelter Versuch #7"); c_printf(4,9,"Matthias Splieth"); c_printf(4,10,"'LK'DTV 12/2"); c_printf(4,11,"14.05.2004"); printf("\n\n\n\n Weiter mit Eingabetaste!"); getchar(); getchar(); } void auswahl() { scanf("%c", &wahl); switch(wahl) { case '1': felder(); break; case '2': eingeben(); break; case '3': anzeigen(); break; case '4': bearbeiten(); break; case '5': speichern(); break; case '6': laden(); break; case '7': infos(); break; case '8': exit(1); } }
Ich hoffe, es ist anhand der funktionen zu erkennen was was sein soll!
dann hab ich die laden-Funktion nochmal so geschrieben und kommentiert wie ich mir denke, wie der Hase laufen muss...
-
- Was heißt killt das Programm???
- Wenn das Programm durch einfügen zweier simpler printf Statements abstürzt, ist der Fehler typischerweise
ein Pointerfehler.- Schade das du die simple Lösung der File lesens wieder durch die kompliziertere und fehleranfääligere
Lösung ersetzt hast.- Eine Antowrt auf die Fragen wäre auch nicht schlecht??
- Das ist ein C++ Konstruct in C wird typischerweise alloc/calloc verwendet
int *tabelle= new int[feld];
-
PAD schrieb:
- Das ist ein C++ Konstruct in C wird typischerweise alloc/calloc verwendet
int *tabelle= new int[feld];
Das hätte ich jetzt auch gleich angemeckert ;). Und wenn man die Zeile drüber anschaut, dann weiß man auch, warum das Programm gekillt wird. Welchen Wert wird wohl die Variable feld haben??
-
Morgen!
legen wir mal los...@ PAD
- Was heißt killt das Programm???
d.h. dass Programm verabschiedet sich, stürzt ab ^^
- Wenn das Programm durch einfügen zweier simpler printf Statements abstürzt, ist der Fehler typischerweise
ein Pointerfehler.Ist mir auch schon klar, ich kann aber keinen Fehler entdecken...
- Schade das du die simple Lösung der File lesens wieder durch die kompliziertere und fehleranfääligere
Lösung ersetzt hast.ich hab die andere auch noch, keine sorge...;) ich wollte das nur noch mal nach meiner "logik" verdeutlichen wie ich das problem sehe!
- Das ist ein C++ Konstruct in C wird typischerweise alloc/calloc verwendet
Oh, wusste ich gar nicht! aber alloc/calloc sagt mir gerade eher wenig...
Das hätte ich jetzt auch gleich angemeckert . Und wenn man die Zeile drüber anschaut, dann weiß man auch, warum das Programm gekillt wird. Welchen Wert wird wohl die Variable feld haben??
hmm...ok, ich denke mal sie hat den wert 1, aber wie soll ich das groß ändern? ich kann ihr ja nicht wieder "wert" zuweisen (nur mal angenommen, sie wäre nicht lokal sondern global), denn die hätte ja auch keinen wert... hmmm... man könnte ja ein maximum festlegen, was ja aber wiederum die anzahl der felder, die maan ja selbst bestimmen soll, stören würde! also so schlau das mir dazu ne lösung einfällt bin ich nun auch net...
vorschläge?
-
@Helmut: Letzter Abschnitt
Wenn du ein calloc/alloc oder in C++ ein new aufrufst musst du zu diesem Teitpunkt wissen wieviel platz du brauchst.
Mommentan belegst du Speicher durch ein nicht initialisierte Variable wert, und du kannst nicht davon ausgehen, das wenn du zu einem späteren Zeitpunkt wert ändertst sich die größe von Feld mitändert.
was du an dieser Stelle definieren Mußt ist ein Pointer auf Feld. und zu dem Zeitpunkt an dem du wert definierst mußt du dann auch den zugehärigen Speicher über ..alloc belegen.
Wenn wert sich ändert mußt du den belgten Speicher freigeben und mit dem neuen "wert" neu allokieren.
Allerdings bei deinem Wissenstand solltest du vorher noch eine oder zwei C-Bücher verstehen
Alternative dazu ist, wenn du weist was die maximalweert von wert ist ein statische Feld mit dieser maximallänge zu definieren und mit diesem zu arbeiten.
Die simple Lösung beruht auf mehreren langen Diskussionen in diesem Forum und ist allgemein als stabil einzuschätzen.
-
achso, so was muss einem ja auch gesagt werden
-
Moin moin!
Ich habe mein Problem inzwischen selber lösen können, aber danke für die Mühe die ihr euch gemacht habt!Wen es interessiert, wie das ganze nun funzt: Ich hab neben der laden-funktion noch eine Funktion eingebaut, die sich um das zählen der zeilen kümmert.
Hier der codeLaden:
void laden() { char tempvar[9]; int i=0; int fehler=0; clrscr(); printf("Bitte geben Sie den Namen der zu lesenden Datei ein: "); getchar(); gets(dateiname); strcat(dateiname,".tab"); feld=zeilenzaehlen(dateiname); tabgr_festgel=1; if((stream = fopen(dateiname,"r")) == NULL) { printf("\nFehler beim Oeffnen! Weiter mit Eingabetaste!"); fehler=1; tabgr_festgel=0; goto weiter; } fgets(tempvar,11,stream); while(!feof(stream)) { tabelle[i]=atoi(tempvar); i++; fgets(tempvar,11,stream); } printf("\nDatei erfolgreich geladen!\nWeiter mit Eingabetaste."); if(fehler==0) { wertegeladen=1; spunter=1; } weiter: fclose(stream); getch(); getchar(); }
und die Funktion zum zählen der zeilen:
zeilenzaehlen(char name[80]) { int tempvar; int i=0; if((stream = fopen(name,"r")) == NULL) { goto weiter; } tempvar=fgetc(stream); while(!feof(stream)) { if(tempvar==10) { i++; } tempvar=fgetc(stream); } return i-1; weiter: fclose(stream); }
Also nochmal danke!
Mfg, Helmut`
-
Wie reservierst du den Speicher für die Tabelle?
Dein Lösungsansatz mit der Zeilenzahl ist in Ordnung.
Aber nur wenn dui Sicherstellst das du nicht mehr Zeilen liest als in deinem Feld platz haben.
Sonst läuft das Programm 95 % der Zeit rund und ab und zu stürzt es ab.Als entweder muß nach dem Feststellen der Größe ein ..alloc Funktion hin die entsprechend Speicher reserviert, oder in es muß das Ergebnis von Zeilenzählen gegen die maximalzahl der speicherbaren
Werte geprüft werden.