myGully.com

myGully.com (https://mygully.com/index.php)
-   Programmierung (https://mygully.com/forumdisplay.php?f=67)
-   -   Ausgabe Datei erstellen, Frage (https://mygully.com/showthread.php?t=2538981)

Kaioken90 03.01.12 21:15

Ausgabe Datei erstellen, Frage
 
Hallo Leute,

an der Uni musste ich ein Program schreiben und dabei bin ich auf ein kleines Problem gestoßen :) Das Programm ist eig schon fertig, läuft schön, habe es mit Visual C++ programiert.

Es rechnet bei der Simulation und spuckt dabei Ergebnisse aus, die er als eine "Ergebnis.txt" Datei speichert. Dies habe ich so geschrieben:

PHP-Code:

void gebeAus() {                                                                        //Datei oeffnen
        
ausgabe fopen("Ergebnis.txt","a");
if(
ausgabe != NULL) {
fprintf(ausgabe,                                                                    // Die Ausgabe
     
"%2.4lf s %15.6lf A %15.6lf V %15.6lf Ohm %10.6lf W (Pw) %15.6lf W (Pel) %15.6lf W (Pstr) %20.10lf Kelvin (Temp. d. Drahtes) %20.10lf Kelvin (Temp. d. Glaskolbens) \n",\
     
t,I,U,Rt,Pw,Pel,Pstr,Tkelv,Tkelv_g);  
    }
    
fclose(ausgabe); 


Mein Intervall geht von 0.000001 Sekunde (also eine Microsekunde) bis 1.0 Sekunde. Ist in der Aufgabenstallung vorgegeben. Lieder hat dann die Ergebnisdatei über eine Mio. Zeilen :D und das möchte ich nicht. Gibt es eine Möglichkeit bzw. ein Befehl der mir es ermöglicht, z.b. alle 100 Zeilen in die Ergebnisdatei zu speichern und nicht jede ohne das ich das Intervall ändere, weil es muss bei der Microsekunde bleiben.

Vielen Dank im Voraus :)

Kaioken90 04.01.12 22:26

Danke ich versuch es dann mal :)

Kaioken90 04.01.12 22:59

Also es geht darum das ich eine Glühlampe simulieren muss, ich hab erst alle Variablen bennant, danach die Formeln aufgstellt, die Spannung, Widerstand, Temperatur des Drahtes usw. berechnen in Abhängigkeit von der Zeit, unzwar im Interwall von

1*10^-6 sekunden bis zur 1 Sekunde. Wenn das Program ein Intervall hinter sich hat, dann wird diese sofort in die Datei gespeichert und das macht er bis er die eine Sekunde erreicht hat. mein t ist halt immer t = t + Intervall.

Jetzt habe ich Probleme mit deinem Vorschlag, unzwar weiß ich jetzt nicht gaz was das mit dem "CounterTxtDatei" bedeutet.


Wenn ich "ausgabe = fopen("Ergebnis"+ CounterTxtDatei.(String) + ".txt","a");" schreibe dann zeigt er mir en --> Der Ausdruck muss einen Klassentyp aufweisen



Habe ich das richtig vertanden mit der If zeile die du mir geschrieben hast, das soll bedeuten, wenn die Zeile größer gleich 1 ist soll der dann die nächte +1 schreiben, richtig?

Sry, die Fachsprache der Programierer behersche ich nicht :) Studiere ja auch kein Informatik, ich hab diese Program mit seht viel Aufwand und google geschrieben.


Mein Programm spuckt mir ja über 1Mio. Zeilen raus (knapp 180MB), er soll die ja alle berechnen, aber z.b nur jede tausendste speichern. Ich wollte das Intervall ändern indem ich sage er soll nicht jede 1 Microsekunde rechnen sondern jede 100. aber das will der prof nicht -.-

Kaioken90 05.01.12 20:53

Nein, er soll mir nicht mehrere Dateien erstellen, sondern in der "Ergebnis" Datei jedes 100. Ergebnis aus der Rechnung speichern und nicht jedes.

Ich sag mal so, mein Program rechnet ich sag mal "1000" Rechnungen und speichert dies in Form von 1000 Zeilen. Ich brauche aber in der Datei nur jede 100. Rechnung oder 10. Rechnung zu speichern und nicht jede einzelne. :)

Danke für deine Hilfe :T

germgerm 05.01.12 21:59

Wenn du nur jede hunderste Zeile speichern möchtest, kannst du den obigen Code einfach wie folgt verwenden.
PHP-Code:

void gebeAus() {
  
Zaehlerdateizeile++;
  if(
Zaehlerdateizeile 100)
  {
     
Zaehlerdateizeile 0;
     return;
  }      

  ... 


Kaioken90 06.01.12 14:30

Zitat:

Zitat von germgerm (Beitrag 23150924)
Wenn du nur jede hunderste Zeile speichern möchtest, kannst du den obigen Code einfach wie folgt verwenden.
PHP-Code:

void gebeAus() {
  
Zaehlerdateizeile++;
  if(
Zaehlerdateizeile 100)
  {
     
Zaehlerdateizeile 0;
     return;
  }      

  ... 


Ok ich habs so übernommen (zeigt auch keine Fehlermeldung an), aber er speichert immer noch alle Zeilen ab. Aber woher weiß er, dass "Zaehlerdateizeile" meine Zaehlerdateizeile ist? Ist dieser Begriff schon vordefiniert? Weil das Programm läuft ja über das Intervall von einer Microsekunde bezogen auf die Dauer 1 Sekunde. Muss ich da vllt etwas bei der "fprintf(ausgabe" ändern? Weil die speichert ja die Informationen in die Text Datei.

PHP-Code:

// AUSGABE DER WERTE IN EINE DATEI
void gebeAus() {                                                                        //Datei oeffnen
    
Zaehlerdateizeile++;
if(
Zaehlerdateizeile 100)
{
    
Zaehlerdateizeile 0;
    return;
}
    
ausgabe fopen("Ergebnis.txt","a");
if(
ausgabe != NULL) {

     
fprintf(ausgabe,                                                                    // Die Ausgabe
     
"%2.6lf s %15.6lf A %15.6lf V %15.6lf Ohm %10.6lf W (Pw) %15.6lf W (Pel) %15.6lf W (Pstr) %20.10lf Kelvin (Temp. d. Drahtes) %20.10lf Kelvin (Temp. d. Glaskolbens) \n",\
     
t,I,U,Rt,Pw,Pel,Pstr,Tkelv,Tkelv_g);  
     
Zaehlerdateizeile +=1;
    }
    
fclose(ausgabe);                                                                    // Datei schließen
}

// DIE SIMULATION DES EINSCHALTENS
void simuliere() {
    
erzeugeKonstante();                                                                    // Schleifendurchlaeufe
    
double i 0;

for ( 
i<= dauerSimulation+= INTERVALL) {
      
printf("%2.6f / %2.6f\r"dauerSimulation);
      
durchlaufEinesIntervalls();
      
gebeAus();   
    } 


germgerm 06.01.12 17:38

Oje, das war wohl nix ^^

Code:

void gebeAus() {

if(Zaehlerdateizeile%100)
{
    Zaehlerdateizeile++;
    return;
}

...

Habe ich aber wieder nicht ausprobiert!

Zaehlerdateizeile muss von dir irgendwo deklariert sein, von selbst schluckt sowas nur das alte Fortran.

Kaioken90 06.01.12 23:09

Ja ich das Program macht immer noch das selbe, es speichert immer noch jede Zeile. Ich hab schon nach 1sek. 9MB :D und das Program läuft par Minuten bis es fertig ist.

Ja ich hab Zeahlerdateizeile mit double definiert. Aber ich was es genau ist nicht, nur das es = 0 ist.

hier mal das ganze Program:

PHP-Code:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

double M_PI 3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679;
    
FILE *ausgabe;
 
  
  
double Zaehlerdateizeile 1;
  
double I;                                                                                // Grundlage: I = U/Rt
  
double U;
  
double Rt;
 
  
// BERECHNUNG DER SPANNUNG IN ABHAENGIGKEIT VON DER ZEIT:  U(t) = 230 * sqrt(2) * sin (t * 2 * Math.PI * f)
  
  
double t 0;                                                                            // Zeit in Sekunden
  
int FREQUENZ 50;                                                                    // Frequenz = 50 Hz, genormte Netzfrequenz                                   
 
  // BERECHNUNG DES WIDERSTANDES IN ABHAENGIGKEIT VON DER TEMPERATUR: Rt = Rel * (1 + alpha * (T1-T0)), wobei (T1-T0) = delta_T ist

  
double ALPHA 0.0048;                                                                // linearer Temperaturkoeffizient 4,8 * 10 ^-3 K^-1 bei 20°C
  
double delta_T;                                                                        // T1-T0 (T1 => Drahttemperatur, T0 => Raumtemperatur)
  
double Tkelv;                                                                            // Temperatur des Drahtes in °Kelvin   
  
double Tkelv_g;                                                                        // Temperatur des Glases in °Kelvin
  
double raumTemp 293.15;                                                                // Raumtemperatur in Kelvin                                          
  
double Rel;                                                                            // Elektrisches Widerstand            
  
double roSpez 0.0528;                                                                // Spezifischer Widerstand von Wolfram in Ohm^2
  
double laenge 0.62;                                                                    // Laenge in m 0.062
  
double A_d;                                                                            // Querschnitt in m^2 des Drahtes A_d = r ^2 * Math.PI
  
double durchmesser 0.000015;                                                        // Durchmesser in m                                    
  

  // BERECHNUNG DER TEMPERATURDIFFERENZ (delta_T)
  
  // C = DeltaQ/DeltaT  <=> DeltaT = DeltaQ/C
  // C = c * m
  
  
double C_w;                                                                            // Waermekapazitaet in                            J/K (Wolfram)
  
double C_g;                                                                            // Wearmekapazitaet in                            J/K (Glass)
  
int c_w 134;                                                                        // spezifische Waermekapazitaet von Wolfram        in J/(kg*K)  
  
int c_g 700;                                                                        // spezifische Waermekapazitaet von Glas        in J/(kg*K) 
  
double m_d;                                                                            // Masse des Drahtes in kg                        m = V_d * Rho_W
  
double m_g;                                                                            // Masse Glaskolben in kg
  
double V_d;                                                                            // Volumen des Drahtes in m^3
  
double V_g 0.12;                                                                    // Volumen des Glaskolbens in m^3 ergibbt sich aus Subration 2er Kugeln
  
int Rho_W 19270;                                                                    // Dichte von Wolfram in kg/m^3
  
int Rho_G 2500;                                                                        // Dichte von Glass in kg/m^3
    
  // BERECHNUNG DER THERMISCHEN ENERGIE

  
double delta_Q;                                                                        // thermische Energie in J DeltaQ = Pw * delta_t
  
double Pw;                                                                            // Waermeleistung in Watt
  
  // BERECHNEN DER WAERMELEISTUNG
  
  
double Pel;                                                                            // elektrische Leistung in Watt  Pel = Pw + Pstr <=> Pw = Pel - Pstr
  
double Pstr;                                                                            // Strahlungsleistung in Watt
  
  
  // STRAHLUNGSLEISTUNG BERECHNEN
  
  
double BK 0.0000000567;                                                                // Stefan-Boltzmann-Konstante J/K Pstr = T^4 * Bk * Ob * Epsilon(T)
  
double Ob_d;                                                                            // Oberflaeche m^2
  
double Ob_g;
  
double eps_w;                                                                            // Emissionsgrad Wolfram
  
double eps_g;                                                                            // Emissionsgrad Glass
  
  // ZUR RECHNUNG BENÖTIGTEN WERTE

  
double INTERVALL 0.000001;            //0.000001                                                // entspricht Delta t in Sekunden
  
double Terwaerm_draht;                                                                // Erwaermung des Drahtes
  
double Terwaerm_glas;                                                                    // Erwearmung des Glases
  
double ausdehn_l;                                                                        // Laenge nach Ausdehnung
  
double ausdehn_l_glas;                                                                // Leange nach Ausdehnung Glas
  
double ausdehn_d;                                                                        // Durchmesser nach Ausdehnung
  
double ausdehn_d_glas;                                                                // Durchmesser Ausdehnung glas
  
double ausdehnungskoeff_w 0.0000045;                                                // Ausdehnungskoeffizient Wolfram
  
double ausdehnungskoeff_g    0.0000076;                                                // Ausdehnungskoeffizient Glas
  
double dauerSimulation 1.0;                                                            // Simulationsdauer in Sekunden       
  
double Kelvin 273.15;                                   
 
 
 
// BERECHNUNG DER KONSTANEN WERTE DIE FÜR DEN ERSTEN DURCHLAUF BENÖTIGT WERDEN

 
void erzeugeKonstante() {
      
      
A_d pow((durchmesser/2),2) * M_PI;
      
Rel 58.5;                                                                        // Rel = roSpez * laenge / A
      
Tkelv raumTemp;
      
Tkelv_g raumTemp;
      
Ob_d * (durchmesser/2) * M_PI laenge;
      
m_d A_d laenge Rho_W;                                                        // Berechnung der Masse des Drahtes
      
m_g Rho_G V_g;                                                                // Berechnung des Masse des Glaskolebsn (Volumen ergibt sich auch Subtraktion zweier Kugeln, 55mm und 54mm, daraus resultiert die Wandstaerke)
      
C_w c_w m_d;                                                                    // Berechnung der Waermekapazitaet (Wolfram)
      
C_g c_g m_g;                                                                    // Berechnung der Waermekapazitaet (Glas)

}
 
// BERECHNUNG DER WERTE DIE SICH AUFGRUND DER AUSDEHNUNG AENDERN  

void berechneVariable() {

        
delta_T Tkelv Tkelv_g;
        
ausdehn_l laenge * ( ausdehnungskoeff_w delta_T );
        
ausdehn_d durchmesser * ( ausdehnungskoeff_w delta_T);
        
Ob_d * (ausdehn_d/2) * M_PI ausdehn_l;
        
Ob_g M_PI pow((ausdehn_d_glas),2);
}

// BERECHNUNG EINES INTERVALLS

void durchlaufEinesIntervalls() {
        
        
berechneVariable();                                                                // BERECHNUNG DER VERAENDERTEN VARIABLEN
         
        
230 sqrt(2.0) * sin(M_PI FREQUENZ);
        
Rt Rel * ( ALPHA delta_T);
        
Rt;
        
Pel = (U*U)/Rt;
        
eps_w 0.39;                                                                    // Emissionsgrad Wolfram
        
eps_g 0.94;                                                                    // Emissionsgrad  Glas
        
Pstr BK * ((Ob_d * ((pow(Tkelv,4))-(pow(Tkelv_g,4))) * eps_w) - (Ob_g * ((pow(Tkelv_g,4))-(pow(raumTemp,4))) * eps_g)) ; // Waermeabgabe von Draht zu Glaskolen und von Glaskolben zur Umgebungsluft bzw. Raumptemperatur
        
Pw Pel Pstr;
        
Terwaerm_draht = (Pw INTERVALL) / C_w;
        
Terwaerm_glas = (Pw INTERVALL) / C_g;
        
Tkelv Tkelv Terwaerm_draht;
        
Tkelv_g Tkelv_g Terwaerm_glas;
        
INTERVALL
}

// AUSGABE DER WERTE IN EINE DATEI
void gebeAus() {                                                                        //Datei oeffnen
if(Zaehlerdateizeile%100)
{
    
Zaehlerdateizeile++;
    return;
}
    
ausgabe fopen("Ergebnis.txt","a");
if(
ausgabe != NULL) {

     
fprintf(ausgabe,                                                                    // Die Ausgabe
     
"%2.6lf s %15.6lf A %15.6lf V %15.6lf Ohm %10.6lf W (Pw) %15.6lf W (Pel) %15.6lf W (Pstr) %20.10lf Kelvin (Temp. d. Drahtes) %20.10lf Kelvin (Temp. d. Glaskolbens) \n",\
     
t,I,U,Rt,Pw,Pel,Pstr,Tkelv,Tkelv_g);  
     
Zaehlerdateizeile +=1;
    }
    
fclose(ausgabe);                                                                    // Datei schließen
}

// DIE SIMULATION DES EINSCHALTENS
void simuliere() {
    
erzeugeKonstante();                                                                    // Schleifendurchlaeufe
    
double i 0;

for ( 
i<= dauerSimulation+= INTERVALL) {
      
printf("%2.6f / %2.6f\r"dauerSimulation);
      
durchlaufEinesIntervalls();
      
gebeAus();   
    }
}

int main()
{
    
printf("SIMULATION DES EINSCHALTENS EINER GLUELAMPE.\n\nBITTE WARTEN BIS DIE SIMULATION BEENDET IST, DANKE\n");
    
    
simuliere();                                                                         // Beginn der Simulation
        
    
printf("\n\n\nDIE SIMULATION IST BEENDET. SIE KOENNEN NUN DIE ERGEBNIS \nDATEI OEFFNEN. DIESE FINDEN SIE IM MICROSOFT VISUAL C++ PROJEKT ORDNER\n");
    
system("PAUSE");    
    return 
0


germgerm 07.01.12 09:10

Zitat:

Zitat von Kaioken90 (Beitrag 23155076)
Ja ich hab Zeahlerdateizeile mit double definiert. Aber ich was es genau ist nicht, nur das es = 0 ist.

Probier mal
long Zeahlerdateizeile = 0;

Kaioken90 07.01.12 18:52

Zitat:

Zitat von saibot521 (Beitrag 23156247)
PHP-Code:

// Variable deklarieren
int counter 0;

...

void gebeAus() {                                                                        //Datei oeffnen
    
ausgabe fopen("Ergebnis.txt","a");
    if(
ausgabe != NULL) {
               
// reset counter
               
if (counter 99)
               {
                           
counter 0;
               }
               
// nimm immer nur die 1. von 100 Datenzeilen
               
if (counter == 0)
               {
                           
fprintf(ausgabe,                                                                    // Die Ausgabe
                           
"%2.6lf s %15.6lf A %15.6lf V %15.6lf Ohm %10.6lf W (Pw) %15.6lf W (Pel) %15.6lf W (Pstr) %20.10lf Kelvin (Temp. d. Drahtes) %20.10lf Kelvin (Temp. d. Glaskolbens) \n",\
                           
t,I,U,Rt,Pw,Pel,Pstr,Tkelv,Tkelv_g);  
               }
               
// counter um 1 erhöhen
               
counter ++;
    }
    
fclose(ausgabe);                                                                    // Datei schließen


Das ergebnis schaut dann so aus, dass du die Sekunden von:
0.000001 s ...
0.000101 s ...
0.000201 s ...
0.000301 s ...
u.s.w



Ahhhh so einfach! Vielen vielen Dank :T TOP TOP, hätte ich das nur mit "counter" gewusst. Schöne Methode, ist genau das was ich haben wollte. Immerhin sind es jetzt keine 181MB sondern 2.3MB... Ach ja, dadurch das er jetzt alle 100 Schreitte Informationen speichert, speichert er mir am ende nicht die ganze volle Sekunden, sondern nur 0.999901, da fehlen halt die 99 die halt in der "if" schleife defieniert sind, kann man da noch was machen? Möchte ungern das Intervall ändern.

Kaioken90 15.01.12 16:27

Zitat:

Zitat von saibot521 (Beitrag 23158370)
Das Problem ist, dass er nicht bei 0.00000s sondern bei 0.00001s anfängt in die Funktion Ausgabe zu springen. Und wenn du am Ende ne 1 hast und 100 weiter gehst ... dann hast du am Ende immer noch ne 1.

Ich habs mal mit Modulo probiert, aber das hat zumindest bei mir nicht gut funktioniert.

Hab aber dann ne weitere If-Anweisung genommen und nun schaut das Ergebnis so aus:

0.000001 s
0.000100 s
0.000200 s
0.000300 s
u.s.w.

Ich denke das ist genau das, was du haben willst.

PHP-Code:

int counter 0;
bool ErsterDurchlauf true;

...


// AUSGABE DER WERTE IN EINE DATEI
void gebeAus() {                                                                        //Datei oeffnen
    
ausgabe fopen("Ergebnis.txt","a");
    if(
ausgabe != NULL) {
               
// erster Durchlauf nur 99x hochzählen, da nicht bei 0 sondern 0.00001 begonnen wird
               
if(ErsterDurchlauf)
               {
                   if (
counter 98)
                   {
                               
// reset counter
                               
counter 0;
                               
ErsterDurchlauf false;
                   }               
               }
               else
               {
                   if (
counter 99)
                   {
                               
// reset counter
                               
counter 0;
                   }
               }
                                  
               
               
// nimm immer nur die 1. von 100 Datenzeilen
               
if (counter == 0)
               {
                           
fprintf(ausgabe,                                              
                           
"%2.6lf s %15.6lf A %15.6lf V %15.6lf Ohm %10.6lf W (Pw) %15.6lf W (Pel) %15.6lf W (Pstr) %20.10lf Kelvin (Temp. d. Drahtes) %20.10lf Kelvin (Temp. d. Glaskolbens) \n",\
                           
t,I,U,Rt,Pw,Pel,Pstr,Tkelv,Tkelv_g);  
               }
               
// counter um 1 erhöhen
               
counter ++;
    }
    
fclose(ausgabe);                                                                    // Datei schließen




Hi, erst mal Danke :) also anfangs funktioniert es, doch am Ende springt er iwie über und zeigt mir dann im Terminal 0.999999/1.000000 und am Ende der Ergebnisdatei 0.999901 s an o.O komisch obwohl deine if Schleife eig funktionieren müsste

Ice weasel 16.01.12 19:57

Code:

void gebeAus()
{
static int zaehler = 100; // wegen ersten durchlauf
if(zaehler == 100)
{
    //fopen und so
    //ausgabe
    zaehler = 0;
  fclose();
  return;
}
zahler++;
}

das static sorgt dafür das die werte zwischen den funktionsaufrufen erhalten bleiben.

Kaioken90 16.01.12 22:10

Zitat:

Zitat von Ice weasel (Beitrag 23189605)
Code:

void gebeAus()
{
static int zaehler = 100; // wegen ersten durchlauf
if(zaehler == 100)
{
    //fopen und so
    //ausgabe
    zaehler = 0;
  fclose();
  return;
}
zahler++;
}

das static sorgt dafür das die werte zwischen den funktionsaufrufen erhalten bleiben.

Meintest du es so vllt?


PHP-Code:

void gebeAus() {                                                                        //Datei oeffnen
    
static int zaehler 100;
    if(
zaehler == 100)
    {
    
ausgabe fopen("Ergebnis.txt","a");
if(
ausgabe != NULL) {
fprintf(ausgabe,                                                                    // Die Ausgabe
     
"%2.6lf s %15.6lf A %15.6lf V %15.6lf Ohm %10.6lf W (Pw) %15.6lf W (Pel) %15.6lf W (Pstr) %20.10lf Kelvin (Temp. d. Drahtes) %20.10lf Kelvin (Temp. d. Glaskolbens) \n",\
     
t,I,U,Rt,Pw,Pel,Pstr,Tkelv,Tkelv_g);  
    }
        
zaehler 0;
    
fclose(ausgabe);                                                                    // Datei schließen
    
return;
}
zaehler++;



Ice weasel 18.01.12 21:29

ja, funktionierts denn?

Kaioken90 22.01.12 01:22

Zitat:

Zitat von Ice weasel (Beitrag 23197096)
ja, funktionierts denn?

Hi,

ja es funktioniert genau so wie das obrige davor, hat aber den Vorteil das es kürzer ist. Ich habe den Bereich noch auf 500 erhöt, da 100 Schritte doch zu viel sind (wollte der Prof so)

Aber beides funktioniert :)

Vielen Dank an alle


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:02 Uhr.

Powered by vBulletin® (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.