Problem mit laden-Funktion



  • Moin, ich hab da noch mal ein Prob mit meiner laden-Fuktion...

    Es lassen sich Werte in einer belibigen Datei speichern.

    Dateiformat:
    
    1341
    5553
    6431
    

    Ich will diese Werte nun duch meine Funktion auslesen lassen, bekomme aber immer nur den ersten Wert der Datei angezeigt...

    void laden()
     {
       char temp[19]; // Variable zum temporären speichern der Werte
       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!");
             goto weiter; // wenn eine Fehler auftritt gehe zu "weier"
             }
    
       fgets(temp,20,stream); // erste Zeile aus der Datei wird in Variable "temp" geschrieben...
       while(!feof(stream))   // abarbeiten der Zeilen bis das Ende der Datei erricht ist...
       {
          tabelle[i]=atoi(temp); // der Wert von temp wird als "int" in dem Feld tabelle[i] gespeichert
          i++;
          fgets(temp,11,stream); // hier werden alle alle anderen Zeilen der Datei gelesen
       }
       weiter:                   // Verlässt also die Funktion und abfahrt ins Hauptmenü! :D
     }
    

    Was mache ich falsch?
    Mfg, Hemlut`



  • Dieser Thread wurde von Moderator/in flenders aus dem Forum WinAPI in das Forum ANSI C verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Falsch ist beispielsweise das Forum..
    Ich seh da keine WinAPI-Funktion...

    Wo ist stream definiert?
    Was meinst du mit "den ersten Wert der Datei?"



  • Hab's auch gerade gemerkt, ups..:)

    stream ist global definiert. Mit dem ersten Wert der Datei meine ich die erste Zeile, also nach dem oben gennanten Format die Zahl 1341.



  • Hmmm ich kann eigentlich keinen Fehler entdecken, bis auf das, dass du anscheinend fclose() vergessen hast (was aber nicht zu dem Beschriebenen Fehler führen dürfte). Seltsam ist auch noch, dass du einmal max. 20 Zeichen einlesen lässt (vor der Schleife) und dann nur noch max. 11 Zeichen (in der Schleife). Allerdings sollte das auch nichts machen, da du ja nur vierstellige Zahlen hast (oder??).



  • Hmm... hast recht, das sind noch so kleine schönheitsfehler, aber eigentlich dürfte das wirklich nichts ausmachen... Darum bin ich ja auch schon so am verzweifeln, ich find einfach nichts!



  • Prinzipiell sieht deine Lösung richtig aus

    Aber probiers mal damit:

    while(NULL!=fgets(temp,20,stream)) 
       {
          tabelle[i]=atoi(temp);
          i++;
       }
    

    Das andere ist mehr eine Stilfrage.

    goto weiter; // wenn eine Fehler auftritt gehe zu "weier"

    Solche Lösungen sind ungeliebt. Man kann sie in den meisten Fällen durch eine Lösung
    ohne goto ersetzen.

    z. B.

    if((stream = fopen(dateiname,"r")) == NULL)
            printf("\nFehler beim Oeffnen! Weiter mit Eingabetaste!");
     else 
    {
    ....
    }
    


  • 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...

    @AJ

    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 🙂


Anmelden zum Antworten