Berechnung in Datei ausgeben?



  • Hi Leute!

    Ich hab folgendes Programm geschrieben:

    #include<stdio.h>
    
    void eingabe(float *anfangswert, float *endwert, float *dx)
    {
    	printf("Anfangswert = "); scanf("%f", &*anfangswert);
    	printf("Endwert = "); scanf("%f", &*endwert);
    	printf("dx = "); scanf("%f", &*dx);
    }
    
    void funktion(float anfangswert, float endwert, float dx)
    {
    	for(anfangswert=anfangswert; anfangswert<=endwert; anfangswert=anfangswert+dx)
    	{
    		printf("y = f(%f) = %f\n", anfangswert, anfangswert * anfangswert);
    	}
    }
    
    int main ()
    {
    	float anfangswert = 0, endwert = 0, dx = 0;
    
    	eingabe(&anfangswert, &endwert, &dx);
    	funktion(anfangswert, endwert, dx);
    
    return 0;
    }
    

    Das Programm berechnet mir in der Funktion "funktion" eine mathematische Funktion nämlich y=x^2. Ich möchte nun die berechneten Funktionswerte in einer .txt-Datei ausgeben. Das Programm soll mir eine solche .txt-Datei auch erstellen.

    Ich hab in meinem Buch da zu zwar etwas gefunden (fopen...) aber dazu wurde fast nichts bzw. nur sehr magere Erläuterungen dazu gegeben!

    Könnt ihr mir weiterhelfen?



  • Du solltest irgendwann weg von Büchern kommen und entsprechende Beschreibungen von Funktionen/Bibliotheken direkt anschauen, z.B. man-pages: man: fopen. Da steht dann was die Funktionen machen, wie man sie "bedient", was sie zurückgeben. In deinem Fall würdest du halt mit fopen() eine Datei schreibend öffnen, dann mit fprintf() in die Datei das gewünschte schreiben und die Datei dann mit fclose() "schliessen".



  • Probiert hab ich es schon mal damit:

    void funktion(float anfangswert, float endwert, float dx)
    {
    	FILE* fp;																				// Zeiger auf Datenstrom der Datei
    	for(anfangswert=anfangswert; anfangswert<=endwert; anfangswert=anfangswert+dx)
    	{
    		printf("y = f(%f) = %f\n", anfangswert, anfangswert * anfangswert);
    		fp = fopen("beispiel.txt","w");
    		fprintf(fp, "Hallo!");									
    		fclose(fp);																			
    	}
    }
    

    Das Problem ist, dass er mir jetzt das Wort Hallo in beispiel reinschreibt. Ich möchte aber, dass er mir die berechneten Funktionswerte drinstehen!



  • Das dumme an fprintf ist ja, dass das anscheinend nur chars ausgeben kann. Geht das jetzt wirklich nur über den umständlichen weg, mir das berechnete Ergebnis von einem float in ein char umzuwandeln? Was ja eigentlich wiederum gar nicht mal so toll ist. Wie soll man schon anständig einen float in eine Kolonne von chars umwandeln?



  • bandchef schrieb:

    Das Problem ist, dass er mir jetzt das Wort Hallo in beispiel reinschreibt. Ich möchte aber, dass er mir die berechneten Funktionswerte drinstehen!

    Na dann mach das doch! Du hast doch alles da. Du musst nur noch verstehen, was du dort eigentlich machst. Das ist nicht schwer.
    Und wenn du es verstanden hast, merkst du sicher auch, dass dein fopen und fclose sehr ungünstig positioniert sind.



  • Häh du kannst dich fprintf verwenden und deine Zahlenwerte für das Schreiben formatieren? Funktioniert genauso wie bei printf.



  • So sollte dann das fopen fclose schon besser positioniert sein, oder? Jetzt öffne bzw. schreibe ich die Datei vor dere Berechnung der Funktionswerte durch die for-Schleife. Wenn dann nun die Berechnung der Funktionswerte vorbei ist, dann schließe ich die Datei wieder. Stimmt das soweit?

    void funktion(float anfangswert, float endwert, float dx)
    {
    	float ergebnis;
    
    	FILE* fp;			// Zeiger auf Datenstrom der Datei
    	fp = fopen("beispiel.txt","w");		// Datei neu erzeugen bzw. ueberschreiben, wenn es sie schon gibt
    	for(anfangswert=anfangswert; anfangswert<=endwert; anfangswert=anfangswert+dx)
    	{
    		ergebnis = anfangswert * anfangswert;
    		//printf("y = f(%f) = %f\n", anfangswert, anfangswert * anfangswert);
    		//fprintf(fp, ergebnis);																// reinen Text "Hallo!" in die Datei schreiben
    	}
    	fclose(fp);		// Datei schließen
    }
    

    Jetzt muss ich eben nur noch wissen, wie ich diese verdammten float-Zahlen in mein fprintf reinbekomme, nicht wahr?

    Ich hab im Internet auch noch was zu sprintf gefunden. Könnte mich das weiterbringen?



  • Wenn ich mein fprintf genauso wie printf verwenden kann, dann sieht der Code so aus: (der Compiler jammert aber trotzdem!)

    void funktion(float anfangswert, float endwert, float dx)
    {
    	float ergebnis;
    
    	FILE* fp;			// Zeiger auf Datenstrom der Datei
    	fp = fopen("beispiel.txt","w");		// Datei neu erzeugen bzw. ueberschreiben, wenn es sie schon gibt
    	for(anfangswert=anfangswert; anfangswert<=endwert; anfangswert=anfangswert+dx)
    	{
    		ergebnis = anfangswert * anfangswert;
    		//printf("y = f(%f) = %f\n", anfangswert, anfangswert * anfangswert);
    		fprintf("%f", ergebnis);																// reinen Text "Hallo!" in die Datei schreiben
    	}
    	fclose(fp);		// Datei schließen
    }
    


  • Es heißt auch fprintf(fp,".......



  • Wtf stell dich nicht so an und lies mal ein Buch! Wie ich sagte geht es GENAUSO wie mit printf.

    int n = 10;
    fprintf (pFile, "Name %i",n);
    

    Du solltest vor dem Versuch in die Datei zu schreiben erstmal prüfen, ob die Datei auch wirklich offen ist!

    Edit: Entschuldigung wenn ich zu grob bin, ich meins nicht böse. Aber du postest einfach ohne intensiv/länger nachzudenken oder nachzulesen. Das ist anstrengend.



  • Nebenbei:

    bandchef schrieb:

    Wie soll man schon anständig einen float in eine Kolonne von chars umwandeln?

    Dafür gibt es sprintf. (vorne mit s für string)



  • Und printf(...) ist eigentlich ein fprintf(stdout,...)



  • Wtf stell dich nicht so an und lies mal ein Buch!

    Edit: Entschuldigung wenn ich zu grob bin, ich meins nicht böse. Aber du postest einfach ohne intensiv/länger nachzudenken oder nachzulesen. Das ist anstrengend.

    Ist nicht so schlimm; ich hab ne dicke Haut sonst hätte ich wohl hier eh nicht so lange bestand. (Bitte das jetzt auch nicht zu ernst nehmen, ja?) Was ich mir allerdings (nicht mehr) nachsagen lasse, ist, dass ich KEIN Buch lese. Ich hab mir mittlerweile eins nach intensiver Recherche und rumfragerei zugelegt!

    Du solltest vor dem Versuch in die Datei zu schreiben erstmal prüfen, ob die Datei auch wirklich offen ist!

    Wie soll ich das anstellen? Dazu gibt mein Buch leider gar nix her... Das einzige was ich gefunden habe ist ein kleiner Codeschnipsel welcher prüft ob die gewünschte Datei geöffnet werden kann!

    void funktion(float anfangswert, float endwert, float dx)
    {
    	float ergebnis;
    
    	FILE* fp;			// Zeiger auf Datenstrom der Datei
    	fp = fopen("funktionswerte.txt","w");		//Datei neu erzeugen bzw. ueberschreiben, wenn es sie schon gibt
    	if(fp == NULL)
    	{
    		printf("Fehler: Datei kann nicht geöffnet werden!");
    		break;
    	}
    	for(anfangswert=anfangswert; anfangswert<=endwert; anfangswert=anfangswert+dx)
    	{
    		ergebnis = anfangswert * anfangswert;
    		printf("y = f(%f) = %f\n", anfangswert, anfangswert * anfangswert);
    		fprintf(fp, "y = f(%f) = %f\n", anfangswert, ergebnis);					//Funktionswerte in die Datei schreiben
    	}
    	fclose(fp);		//Datei schließen
    }
    


  • Es ist ja auch nur ein Codeschnipsel:

    FILE * pFile;
      pFile = fopen ("test.txt","w");
      if (pFile!=NULL)
      {
        //Deine Schreiboperationen
        fclose (pFile);
      }
    

    oder

    FILE * pFile;
      pFile = fopen ("test.txt","w");
      if (pFile==NULL)
      {
        //Fehlermeldung
      }
      else
      {
        //Deine Schreiboperationen
        fclose (pFile);
      }
    

    Ich meinte aber nicht lies ein Buch sondern eher, lies in deinem Buch nach sry. ich kann mir halt schlecht vorstellen, dass dies nicht ausführlich behandelt wird.



  • So, ich hab jetzt mal die schon angelegt Datei im Windows-Explorer "Schreibgeschützt" und dann versucht mit meinem Programm in genau diese Datei wieder reinzuschreiben und er bringt mir jetzt wie erwartet genau die Fehlermeldunge welche im else-Zweig der if-Abfrage steht. Sehr schön. Mich freuts jedenfalls 🙂

    #include<stdio.h>
    
    void eingabe(float *anfangswert, float *endwert, float *dx)
    {
    	printf("Anfangswert = "); scanf("%f", &*anfangswert);
    	printf("Endwert = "); scanf("%f", &*endwert);
    	printf("dx = "); scanf("%f", &*dx);
    }
    
    void funktion(float anfangswert, float endwert, float dx)
    {
    	float ergebnis;
    
    	FILE* fp;			//Zeiger auf Datenstrom der Datei
    	fp = fopen("funktionswerte.txt","w");		//Datei neu erzeugen bzw. ueberschreiben, wenn es sie schon gibt
    
    	if(fp != NULL)
    	{
    		for(anfangswert=anfangswert; anfangswert<=endwert; anfangswert=anfangswert+dx)
    		{
    			ergebnis = anfangswert * anfangswert;
    			printf("y = f(%f) = %f\n", anfangswert, anfangswert * anfangswert);		//Funktionswerte auf Bildschirm ausgeben
    			fprintf(fp, "y = f(%f) = %f\n", anfangswert, ergebnis);					//Funktionswerte in die Datei schreiben
    		}
    		fclose(fp);		//Datei schließen
    	}
    	else
    	{
    		printf("Fehler: Datei konnte nicht geöffnet werden!");
    	}
    }
    
    int main ()
    {
    	float anfangswert = 0, endwert = 0, dx = 0;
    
    	eingabe(&anfangswert, &endwert, &dx);
    	funktion(anfangswert, endwert, dx);
    
    return 0;
    }
    


  • Auch wenn es zu funktionieren scheint. Dieses &* bei den scanf ist überflüssig, da du ja schon einen Zeiger hast.

    void eingabe(float *anfangswert, float *endwert, float *dx)
    {
        printf("Anfangswert = "); scanf("%f", anfangswert);
        printf("Endwert = "); scanf("%f", endwert);
        printf("dx = "); scanf("%f", dx);
    }
    

Anmelden zum Antworten