Werte innerhalb einer Schleife in eine Datei Schreiben?!



  • Hallo,

    ich habe ein kleines Problem, und zwar habe ich ein Programm geschrieben, dass mir sehr viele Werte berechnet die ich benoetige. Ich habe jetzt nur mal die wichtigen Programmteile gepostet. WIE ich eine Dateiausgabe mache weiss ich(ist hier noch nicht ausgefuehrt), aber leider nicht WO. Da Ausgabe() in der Schleife steht kriege ich logischerweise immer nur die letzten Werte in die Datei geschrieben, da jedesmal die Datei geoeffnet und ueberschrieben und geschlossen wird. Ausserhalb von Ausgabe() kennt er die FILE zuweisung aber nicht.

    Frage: WO muss ich die Datei oeffnen und Schliessen damit ich ALLE Werte kriege? Schmetisch ist das Programm so aufgebaut: Gruss Illu!

    int main ()
    {Start ();
    Programmeinstellungen();
    Berechnung();
    Ende();
    }

    int Berechnung ()

    { for (m=0; m<43200; m = m + dm)
    {Ausgabe ();
    for (t=0; t<60; t = t + dt)
    {Ueberpruefung ();
    Berechnung ();}}
    Ausgabe ();
    }

    int Ausgabe ()
    { printf ("%.5f %.0f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f \n" ,
    m,h,u,a,c,v,b,n,s,g,f);
    }



  • vor dem ersten schreiben öffnen. also sinnvollerweise in deinem fall wohl in Programmeinstellungen() und schließe nach dem letzten einrag, also in Ende().



  • Hab ich versucht, aber dann meckert er, dass er innerhalb von ausgabe () das nicht kennt....

    dv25.c: In function ‘Ausgabe’:
    dv25.c:179: error: ‘save’ undeclared (first use in this function)
    dv25.c:179: error: (Each undeclared identifier is reported only once
    dv25.c:179: error: for each function it appears in.)
    dv25.c: In function ‘Ende’:
    dv25.c:187: error: ‘save’ undeclared (first use in this function)

    Nochmal mit der FILE Zuweisung:

    int Ausgabe ()
    {
    fprintf (save,"%.5f %.0f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f \n" ,
    m,
    H,
    Utemp,AKEtemp, AWAtemp, AHKSZtemp, AHKBZtemp, AHKWZtemp, ASZtemp, ABZtemp, AWZtemp);
    }

    -> Das steht (u.a.)in der int Ende ():
    fclose(save);
    -> Das steht (u.a) in der int Programmeinstellungen ():
    FILE *save;
    save = fopen("save.dat","w");
    if (save==NULL)
    {

    fprintf(stderr, "Fehler beim Öffnen der Datei.\n");
    exit(1);
    }

    Jemand eine Idee?



  • entweder FILE *save; global machen,
    oder als parameter übergeben
    mfg



  • mit global machen meinst du doch ausserhalb der ausgabe() das FILE zu oeffnen oder? Ich habe es zu beginn des ganzen programmes und innerhalb der main() versucht. Beide klappt nicht. Waere sehr nett wenn du mir das kurz erklaeren koenntest, auch wie du das mit der parameter uebergabe meinst. Danke!



  • ne, du kannst die variable global deklarieren.
    dann kannst du die datei in main(), Ausgabe() ... praktisch überall öffnen.
    bedeutet, du schreibst die deklaration über alle anderen funktionen oben drüber:

    FILE* save;
    

    oder schreibst sie in eine header-datei.

    parameter sind die variablen in den klammern einer funktion:

    int testfunktion( int integer_parameter )
    

    hier ist die integer-variable mit dem namen integer_parameter ein parameter.



  • Habe ich versucht, aber es klappt nicht. Glaube ich habe mittlerweile alles ausprobiert - und schaffe es nicht...deshalb jetzt mal den kompletten Code, ware nett wenn du mir zeigst was ich wohinschreiben muss - Danke...

    #include <stdio.h>
    #include <math.h>
    #include <string.h>
    #include <stdlib.h>
    FILE *save;

    // KONSTANTEN
    double ZWZtemp = 20.0; // Ziel-Wohnzimmertemperatur
    double ZSZtemp = 17.0; // Ziel-Schlafzimmertemperatur
    double ZBZtemp = 22.0; // Ziel-Badezimmertemperatur

    float R_NE_U = 0.02639; // Wärmewiderstand Niedrigenergiehaus zu Umgebung
    float R_AB_U = 0.004285; // Wärmewiderstand Altbauhaus zu Umgebung
    float R_KE_WA = 0.0007; // Wärmewiderstand Heizkessel zu Wasser
    float R_WA_HK = 0.001; // Wärmewiderstand Wasser zu Heizkörper
    float R_HK_ZI = 0.003; // Wärmewiderstand Heizkörper zu Zimmer

    float C_KE = 30000.0; // Wärmekapazität Heizkessel
    float C_HK = 30000.0; // Wärmekapazität Heizkörper
    float C_WA = 714000.0; // Wärmekapazität Wasser
    float C_ZI = 227000.0; // Wärmekapazität Zimmer

    double HW = 20000.0; // Heizwert

    // Variablen
    double HL; // aktuelle Heizleistung

    double Utemp_tag; // Umgebungstemperatur Tag
    double Utemp_nacht; // Umgebungstemperatur Nacht
    double Utemp ; // aktuelle Umgebungstemperatur

    double dt = 1.0; // Delta t = 1 Sekunde
    double dm = 1.0; // Delta m = 1 Minute
    double t; // Vergangene Zeit in Sekunden
    double m; // Vergangene Zeit in Minuten

    double AWZtemp; // Aktuelle-Wohnzimmertemperatur
    double ASZtemp; // Aktuelle-Schlafzimmertemperatur
    double ABZtemp; // Aktuelle-Badezimmertemperatur
    double AHKSZtemp; // Aktuelle-Heizkörpertemperatur Schlafzimmer
    double AHKBZtemp; // Aktuelle-Heizkörpertemperatur Badezimmer
    double AHKWZtemp; // Aktuelle-Heizkörpertemperatur Wohnzimmer
    double AWAtemp; // Aktuelle-Wassertemperatur
    double AKEtemp; // Aktuelle-Kesseltemperatur

    int HI; // Art der Hausisolierung
    int NA; // Nachtabschaltung ja/nein
    double AI; // aktuelle Isolierung

    double x; // aktueller Heizanteil Badezimmer
    double y; // aktueller Heizanteil Schlafzimmer
    double z; // aktueller Heizanteil Wohnzimmer

    int main ()
    {
    Start ();
    Programmeinstellungen();
    Temperaturberechnung();
    Ende();
    }

    int Start ()

    {
    printf ("\n****** PROGRAMM heizungssimulation.c GESTARTET ******\n");
    printf ("\n");
    }

    int Programmeinstellungen ()

    { // Isolierung

    printf ("Welche Hausisolierung soll gewählt werden? \n");
    printf ("\n");
    printf ("< 1 > Niedrigenergiehaus \n");
    printf ("< 2 > Altbau \n");
    scanf ("%d", &HI);
    printf ("\n");

    if (HI == 1) AI = R_NE_U;
    else if (HI == 2) AI = R_AB_U;
    else printf("Eingabefehler! 1 oder 2 auswählen \n");

    // Nachtabschaltung
    printf ("Heizung mit Nachtabschaltung? \n");
    printf ("< 1 > ja \n");
    printf ("< 2 > nein \n");
    scanf ("%d", &NA);
    printf ("Berechnung laeuft...\n");

    //Nachtabschaltung

    // Startwerte
    AWZtemp = 10.0;
    ASZtemp = 10.0;
    ABZtemp = 10.0;
    AHKSZtemp = 10.0;
    AHKBZtemp = 10.0;
    AHKWZtemp = 10.0;
    AWAtemp = 10.0;
    AKEtemp = 10.0;
    HL = HW;
    Utemp = 0.0;
    }

    int Temperaturberechnung ()

    { for (m=0; m<43200; m = m + dm)
    {Ausgabe ();
    for (t=0; t<60; t = t + dt)
    {Ueberpruefung ();
    Berechnung ();}}
    Ausgabe ();
    }

    int Ueberpruefung ()

    { // Heizungssteuerung
    if ((AWZtemp < (ZWZtemp - 0.3)) || (ASZtemp < (ZSZtemp - 0.3)) || (ABZtemp < (ZBZtemp -0.3))) {(HL=HW);}
    else {(HL = 0.0);}

    // Ventilsteuerung
    if ((AWZtemp < ZWZtemp) && (ASZtemp > ZSZtemp) && (ABZtemp > ZBZtemp)) {(x = 0.0, y = 0.0, z = 1.0);}
    if ((AWZtemp > ZWZtemp) && (ASZtemp < ZSZtemp) && (ABZtemp > ZBZtemp)) {(x = 0.0, y = 1.0, z = 0.0);}
    if ((AWZtemp > ZWZtemp) && (ASZtemp > ZSZtemp) && (ABZtemp < ZBZtemp)) {(x = 1.0, y = 0.0, z = 0.0);}
    if ((AWZtemp < ZWZtemp) && (ASZtemp < ZSZtemp) && (ABZtemp > ZBZtemp)) {(x = 0.0, y = 0.5, z = 0.5);}
    if ((AWZtemp < ZWZtemp) && (ASZtemp > ZSZtemp) && (ABZtemp < ZBZtemp)) {(x = 0.5, y = 0.0, z = 0.5);}
    if ((AWZtemp > ZWZtemp) && (ASZtemp < ZSZtemp) && (ABZtemp < ZBZtemp)) {(x = 0.5, y = 0.5, z = 0.0);}
    if ((AWZtemp < ZWZtemp) && (ASZtemp < ZSZtemp) && (ABZtemp < ZBZtemp)) {(x = 0.33, y = 0.33, z = 0.33);}
    }

    int Berechnung ()
    {
    Utemp = 5.0;//-0.0151*(t/3600)(t/3600)(t/3600) + 0.3934*(t/3600)(t/3600) -1.3147t/3600,
    AKEtemp = AKEtemp + dt*(HL/C_KE) - dt*((AKEtemp-AWAtemp)/(C_KER_KE_WA));
    AWAtemp = AWAtemp + dt
    ((AKEtemp-AWAtemp)/(C_WA*R_KE_WA)) - dt*((x*(AWAtemp-AHKBZtemp)+y*(AWAtemp-AHKSZtemp)+
    z*(AWAtemp-AHKWZtemp))/(C_WAR_WA_HK));
    AHKSZtemp = AHKSZtemp + dt
    (y*(AWAtemp-AHKSZtemp)/(C_HKR_WA_HK)) -
    dt
    ((AHKSZtemp-ASZtemp)/(C_HKR_HK_ZI));
    AHKBZtemp = AHKBZtemp + dt
    (x*(AWAtemp-AHKBZtemp)/(C_HKR_WA_HK)) -
    dt
    ((AHKBZtemp-ABZtemp)/(C_HKR_HK_ZI));
    AHKWZtemp = AHKWZtemp + dt
    (z*(AWAtemp-AHKWZtemp)/(C_HKR_WA_HK) -
    dt
    ((AHKWZtemp-AWZtemp)/(C_HKR_HK_ZI)));
    ASZtemp = ASZtemp + dt
    ((AHKSZtemp-ASZtemp)/(C_ZIR_HK_ZI)) -
    dt
    ((ASZtemp-Utemp)/(C_ZIAI));
    ABZtemp = ABZtemp + dt
    ((AHKBZtemp-ABZtemp)/(C_ZIR_HK_ZI)) -
    dt
    ((ABZtemp-Utemp)/(C_ZIAI));
    AWZtemp = AWZtemp + dt
    ((AHKWZtemp-AWZtemp)/(C_ZIR_HK_ZI)) -
    dt
    ((AWZtemp-Utemp)/(C_ZI*AI));
    }

    int Ausgabe ()
    {
    save = fopen("save.dat","w");
    if (save==NULL)
    {

    fprintf(stderr, "Fehler beim Öffnen der Datei.\n");
    exit(1);
    }
    fprintf (save,"%.5f %.0f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f \n" ,
    m/60,
    HL/20000,
    Utemp,AKEtemp, AWAtemp, AHKSZtemp, AHKBZtemp, AHKWZtemp, ASZtemp, ABZtemp, AWZtemp);
    }

    int Ende ()
    {
    fclose(save);
    printf ("\nSimulationsdaten in Datei > save.dat < geschrieben\n");
    printf ("\n****** PROGRAMM heizungssimulation.c BEENDET ******\n");
    printf ("\n");
    }



  • hat sich erledigt, thx trotzdem!!! Ich hab in der Schleife der FILE Anweisung einfach nur die Rechte zum hinzuschreiben "a" gegeben, und vorher die Datei geleert. Das reicht fuer meine Zwecke. Gruss Illu


Anmelden zum Antworten