Verbrauchsrechner selber "bauen"



  • Ich hab das daher gezogen: http://www.cplusplus.com/reference/cstdio/fscanf/

    Ich denke, laut der Seite wäre ich ja mit f bestens beraten.

    if (Verbrauchsrechner = fopen ("Verbrauchsrechner.txt", "r")) {
    
    	     Verbrauchsrechner = fopen ("Verbrauchsrechner.txt", "a+");
    
    //		 fscanf(Verbrauchsrechner , "%f;%f;%f;%f;%99[^;]", &Kilometerstand, &Tankinhalt,  &Letzterverbrauch, &Durchschnittsverbrauch, Datum); // i ist glaube ich für mich die falsche formatierung, weil ich ja ein double will, also wsh d
    
    	//	 printf("Kilometerstand %s\nTankinhalt: %s\nLetzter Verbrauch %i\nDurchschnittsverbrauch: %i\nDatum: %s", Kilometerstand, Tankinhalt, Letzterverbrauch, Durchschnittsverbrauch, Datum);
    
    		 printf("Neuer Kilometerstand:\n");
    		 scanf("%lf", &KilometerstandNeu);
    		 fprintf (Verbrauchsrechner, "%.2f;", KilometerstandNeu);
    

    Wenn ich fscanf und das dazugehörige printf weglasse, schreibt er neue Daten in die Datei.

    Also das funktioniert. Nur scheiter ich immer noch am Datei auslesen... ich setz mich ne halbe Stunde, Stunde hin und probier rum und komm nicht weiter und dann verlässt mich irgendwie auch schnell der Mut - das war mit Java/C# nicht sooo schwer, wobei ich C an sich ja schon ganz interessant finde...



  • Jetzt lass doch endlich mal die verschissenen Zeile mit dem "a+" weg!

    Hast du immer noch nicht kapiert, dass die total falsch ist?



  • Ne, habe ich nicht verstanden, weil ich durch die Zeile ja was reinschreiben konnte in die txt Datei...



  • Du willst doch aber was daraus lesen.



  • Schon, aber danach will ich ja neue Daten einschreiben. Tut mir leid, dass ich mich so saublöd anstelle, aber ich komm nicht drauf.



  • Alles der Reihe nach.
    - Datei zum Lesen öffnen
    - Daten auslesen
    - Datei schließen ⚠
    - Datei zum Schreiben/Anhängen öffnen
    - Daten schreiben
    - Datei schließen


  • Mod

    C-Tabaluga schrieb:

    Also das funktioniert. Nur scheiter ich immer noch am Datei auslesen... ich setz mich ne halbe Stunde, Stunde hin und probier rum und komm nicht weiter und dann verlässt mich irgendwie auch schnell der Mut - das war mit Java/C# nicht sooo schwer, wobei ich C an sich ja schon ganz interessant finde...

    Da C in Sachen Dateihandling nicht so großartig anders ist: Wie würdest du es denn in C# machen? Schreib ruhig mal ein kleines Programm (und teste, ob es auch wirklich funktioniert!). Fällt dir was auf bezüglich der Art und Weise, wie du die Datei öffnest?



  • if (Verbrauchsrechner = fopen ("Verbrauchsrechner.txt", "r")) {
    
    	     Verbrauchsrechner = fopen ("Verbrauchsrechner.txt", "r");
    
    		 fscanf(Verbrauchsrechner , "%f;%f;%f;%f;%99[^;]", &Kilometerstand, &Tankinhalt,  &Letzterverbrauch, &Durchschnittsverbrauch, Datum); // i ist glaube ich für mich die falsche formatierung, weil ich ja ein double will, also wsh d
    
    		 printf("Kilometerstand %s\nTankinhalt: %s\nLetzter Verbrauch %i\nDurchschnittsverbrauch: %i\nDatum: %s", Kilometerstand, Tankinhalt, Letzterverbrauch, Durchschnittsverbrauch, Datum);
    
    		 fclose (Verbrauchsrechner);  
    
    		 Verbrauchsrechner = fopen ("Verbrauchsrechner.txt", "a+");
    
    		 printf("Neuer Kilometerstand:\n");
    		 scanf("%lf", &KilometerstandNeu);
    		 fprintf (Verbrauchsrechner, "%.2f;", KilometerstandNeu);
    
    //..........................
    

    Da sollte die Reihenfolge nun stimmen.

    Bei C# wären die Möglichkeiten ja simpler, meiner Meinung nach, ich würd nen String erstellen bzw. ne Variable, der ich den Text bzw die Zahl zuteilen kann per StreamReader und z.B. mit ReadToEnd() arbeiten... aber das tut für C nichts zur Sache... ich finde einfach den Fehler nicht beim einlesen, weil wenn ich mit den C++ Preferences vergleiche und das parallel so machen will, kommt meine Version dabei raus, aber irgendwo hakt das noch...



  • weglassen ist ändern, aber ändern ist nicht unbedingt weglassen.

    Was machen die Zeilen 1 und 3?
    Vor der Antwort nochmal darüber nachdenken.

    Ist Kilometerstand eine Variable vom Typ float ?
    Denn scanf speichert bei %f die Daten in einer float -Variablen.

    Falls du jetzt der Meinung bist, die andern Formatspecifier hast du schon probiert und es hat auch nicht funktioniert, dann lass dir sagen, es lag nicht alleine an den Specifiern.

    Denn

    DirkB schrieb:

    Jetzt lass doch endlich mal die verschissenen Zeile mit dem "a+" weg!

    Hast du immer noch nicht kapiert, dass die total falsch ist?



  • if (Verbrauchsrechner = fopen ("Verbrauchsrechner.txt", "r")) // hier versuchst du die Datei zu öffnen! Wenn es gelungen ist, =>
     {
             Verbrauchsrechner = fopen ("Verbrauchsrechner.txt", "r"); // warum versuchst du hier die offene Datei ein 2tes mal zu öffnen??
    // Wenn das beim ersten mal nicht gelungen ist die Datei zu öffenen, warum soll das nun funktionieren??
    


  • War jetzt über die beiden Wochen anders beschäftigt, Zeit mal wieder zurück zu der Sache zu kommen.

    Ich dachte bisher, dass eine if Bedingung NUR überprüft, aber nicht gleichzeitig ein Befehl ist. Deshalb dachte ich, erst testen, ob sie vorhanden ist und dann den Befehl ausrufen, sie soll geöffnet werden...



  • Das fopen in denr Bedingung vom if wird ausgeführt. Wie soll denn if sonst an den Rückgabewert von fopen kommen?



  • double Tankinhalt = 0;
         double Kilometerstand = 0;
    	 double KilometerstandNeu = 0;
    	 double Letzterverbrauch = 0;
    	 double Durchschnittsverbrauch = 0;
    	 double Verbrauch = 0;
    	 char Datum[14];
    
    	 FILE *Verbrauchsrechner;
    
    	 if (Verbrauchsrechner = fopen ("Verbrauchsrechner.txt", "r")) {
    
    		 fscanf(Verbrauchsrechner , "%d;%d;%d;%d;%s", &Kilometerstand, &Tankinhalt,  &Letzterverbrauch, &Durchschnittsverbrauch, Datum); // i ist glaube ich für mich die falsche formatierung, weil ich ja ein double will, also wsh d
    
    		 printf("Kilometerstand %i\nTankinhalt: %i\nLetzter Verbrauch %i\nDurchschnittsverbrauch: %i\nDatum: %s", Kilometerstand, Tankinhalt, Letzterverbrauch, Durchschnittsverbrauch, Datum);
    
    		 fclose (Verbrauchsrechner);
    

    So, dieses Wochenende muss es endlich laufen. Nach den Anfangsschwierigkeiten liest er jetzt endlich alles aus und zeigts mir an.

    Allerdings happerts bei mir noch gewaltig mit den Formatierungen.

    So wies hier steht, funktionierts, aber das ist ja noch nicht das Ziel. Au0er das Datum, das gibt er <null> zurück in der Konsole...

    Ich will sie ja als double einlesen, das funktioniert mit %d aber nicht...

    Kann jemand so nett sein und mir die Formatierungen verraten, womit mein Vorhaben funktioniert?

    Wenn das läuft, fehlt nur noch die Rechnung bzw das reinkriegen einer kompletten Spalte, aber erstmal muss das laufen...

    MfG und danke, dass ihr ein Herz für so nen nervigen Typen wie mich habt...



  • Bei printf und bei scanf müssen die Formatspecifier zu den Variablentypen passen.
    scanf :
    %d steht für dezimal int (Ganzzahl in Dezimaldarstellung)
    %i steht für int. Du kannst die Zahl in Dezimal-, Oktal- oder Hexadezimaldarstellung eingeben.*
    %f steht für float
    %lf steht für double (long float)

    printf :
    %d steht für dezimal int (Ganzzahl in Dezimaldarstellung)
    %i ist hier dasselbe wie %d
    %f steht für float und double

    *

    Dezimal:     ganz normal ohne führende Null:  255
    Oktal:       mit führender Null            : 0377
    Hexadezimal: mit führendem 0x              : 0xff
    


  • Danke für eure bisherige Hilfe, bin gerade wieder drüber.

    Also das mit der Formatierung hat jetzt eigentlich funktioniert.

    fscanf(Verbrauchsrechner , "%lf;%lf;%lf;%lf;%s", &Kilometerstand, &Tankinhalt, &Letzterverbrauch, &Durchschnittsverbrauch, &Datum);
    		 printf("Kilometerstand %.0f\nTankinhalt: %.0f\nLetzter Verbrauch %.1f\nDurchschnittsverbrauch: %.1f\nDatum: %s\n", Kilometerstand, Tankinhalt, Letzterverbrauch, Durchschnittsverbrauch, Datum);
    

    Jetzt muss ich natürlich immer jeweils zur letzten Zeile kommen, habe dafür etwas gegooglet und folgendes in meinen Code eingebaut:

    if (Verbrauchsrechner = fopen ("Verbrauchsrechner.txt", "r")) {
    
    		 fseek (Verbrauchsrechner, 0, SEEK_END);
    		 i = ftell (Verbrauchsrechner) - 1;
    		 fseek (Verbrauchsrechner, i, SEEK_SET); // Springe zum i-ten Zeichen
    		 if (i >= 1 && fgetc (Verbrauchsrechner) == '\n') --i; // letzte (und nur letzte) Leerzeile überspringen
    		 do fseek (Verbrauchsrechner, i, SEEK_SET);
    		 while (--i>=0 && fgetc (Verbrauchsrechner) != '\n');
    		 while ((c = fgetc (Verbrauchsrechner)) != EOF && c != '\n') // f ist bei der letzten Zeile
    	 	 fscanf(Verbrauchsrechner , "%lf;%lf;%lf;%lf;%s", &Kilometerstand, &Tankinhalt, &Letzterverbrauch, &Durchschnittsverbrauch, &Datum);
    		 printf("Kilometerstand %.0f\nTankinhalt: %.0f\nLetzter Verbrauch %.1f\nDurchschnittsverbrauch: %.1f\nDatum: %s\n", Kilometerstand, Tankinhalt, Letzterverbrauch, Durchschnittsverbrauch, Datum);
    
    		  fclose (Verbrauchsrechner); 
    
    		  Verbrauchsrechner = fopen ("Verbrauchsrechner.txt", "a+");
    
    		 printf("\nNeuer Kilometerstand:\n");
    		 scanf("%lf", &KilometerstandNeu);
    		 fprintf (Verbrauchsrechner, "%.0f;", KilometerstandNeu);
    
    		 printf("Geben Sie bitte nun die Fuellmenge ein:\n");
    		 scanf("%lf", &Tankinhalt);
    		 fprintf (Verbrauchsrechner, "%.0f;", Tankinhalt);
    
    		 Letzterverbrauch = KilometerstandNeu - Kilometerstand / Tankinhalt;
    		 fprintf(Verbrauchsrechner, "%.1f;", Letzterverbrauch);
    		 printf("Durchschnittsverbrauch: %.1f\n", &Letzterverbrauch);
    
    		 // Hier soll noch der Rechenvorgang für den Durchschnittsverbrauch rein
    
    		  fprintf(Verbrauchsrechner, "%.2f;", Durchschnittsverbrauch);
    		  printf("Durchschnittsverbrauch: %.1f\n", &Durchschnittsverbrauch);
    
    		  printf("Bitte geben Sie das heutige Datum ein: \n");
    	      scanf("%s", &Datum);
              fprintf (Verbrauchsrechner, "%s;\n", Datum);
    
    		  fclose (Verbrauchsrechner);  
    
    		 }
    

    Leider gibt er mir mit dem Code wieder für alles 0 aus bzw für den String eine Reihefolge nicht definierbarer Zeichen.

    Gibts einfachere Wege zur letzten Zeile zu kommen mit funktionierendem Code bzw. dann für den Durchschnittsverbrauch nur eine einzige Spalte immer runterzugehen?

    Bin im Moment leider etwas überfragt - dabei heißt es ja, learning by doing... aber ich habe keinen brauchbaren Ansatz.

    MfG



  • Alle ZEilen durchgehen. In etwa

    while (5 != fscanf(Verbrauchsrechner , "%lf;%lf;%lf;%lf;%s", &Kilometerstand, &Tankinhalt, &Letzterverbrauch, &Durchschnittsverbrauch, &Datum) {
        // hier kannst du noch irgendetwas mit den eingelesenen Daten machen
        // Zeilen zählen 
        // Daten ausgeben
        // oder nichts machen
        ;
      }
    

    So kannst du auch die Daten in ein Array schreiben oder den Durschnitt neu berechnen.


Anmelden zum Antworten