File(Input u. Output)



  • Gut Abend!

    Hab ein paar Fragen zu einem Programm. Das Programm erzeugt 2 zufällige Zahlen
    (a und b) und multipliziert sie.
    Das Ergebnis steht in einem eigene Dokument und die 2 Zahlen die multipliziert werden.

    Ich weiß zwar das "w" für write steht und das man damit eine Datei zum schreiben eröffnet und wenn die Datei existiert wird sie überschrieben.

    Das "r" Öffnet die Datei ausschließlich zum Lesen.

    Soll das bei r jetzt heißen, dass man das Dokument nur zum Lesen öffnen kann, d.h. mann kann es nicht verändern?

    Und das "w" genau umgekehrt?

    Wie weiß man wo man jetzt ein "r" machen muss und wo ein "w".

    Weil wenn ich jetzt ein Programm schreiben das die Funktion sin(x) in ein Dokument z.b. Excel ausgibt, dann schreib ich das mit "w"...

    Was hat es mit der while auf sich braucht man die bei jedem fopen Programm(solange die File nicht zuende ist wird die File ausgeführt)?
    Warum macht man die 2. File mitten in der 1. File auf(fopen)?

    Ich weiß jede Menge Fragen 😞 .

    Danke im voraus!

    MfG Gandalf

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    int main()
    {
    	FILE *Seiten=NULL;
    	FILE *Flaeche=NULL;
    	int i=0;
    	int x=0;
    	int a=0;
    	int b=0;
    	int ergebnis;
    
    	Seiten = fopen("Seiten.csv","w");  
    	if(Seiten == NULL)  
    	{
    		printf("unable to write\n");
    		exit(-1);
    	}
    	for(i=0; i <= 10; i++)
    	{
    		a=rand();
    		b=rand();
    		fprintf(Seiten,"%d;%d\n", a, b);
    	} 
    	fclose(Seiten);
    
    	Seiten = fopen("Seiten.csv","r");
    	if(Seiten == NULL)
    	{
    		printf("unable to read\n");
    		exit(-1);
    	}
      Flaeche = fopen("Flaeche.csv","w");  
    	if(Flaeche == NULL)  
    	{
    		printf("unable to write\n");
    		exit(-1);
    	}
    
    	while(!feof(Seiten))
    	{
    		fscanf(Seiten,"%d;%d\n", &a, &b);
    		printf("%d -> %d\n", a, b);
        ergebnis = a * b;
    		fprintf(Flaeche,"ergebnis = %d\n\n", ergebnis);
    	}
    	fclose(Seiten);
    	fclose(Flaeche);
    	return (0);
    }
    


  • Kannst du die Frage nochmal so formulieren, daß auch andere sie verstehen?

    Zu den Öffnen-Modi:
    "r" öffnet nur zum lesen, "w" nur zum schreiben (der bisherige Inhalt wird gelöscht), "a" zum Anhängen (d.h. Schreiben ans Ende des vorhandenen Inhalts). Wenn du in eine Datei lesen und schreiben willst, kannst du auch "r+", "w+" bzw. "a+" verwenden.



  • Ich weiß nicht wenn ich ein Programm schreiben will das irgndwas in ein Dokument ausgibt ob ich da jetzt "r" oder "w" verwendet muss.("a" bitte nicht erklären).



  • "r" (= read) bedeutet, daß du die Datei lesen willst. Das heißt, du nimmst eine vorhandene Datei und verarbeitest ihren Inhalt in deinem Programm.
    "w" (= write) steht für schreiben. Das heißt, du berechnest irgendwas im Programm und schreibst es in die Datei.



  • Ok, danke.
    Was hat das für einen Sinn:
    Am Anfang des Programms braucht man "w"---> man schreibt die Laengen in Seiten.csv.

    Warum schreibt man Flaeche = fopen("Flaeche.csv","w"); in
    Flaeche = fopen("Flaeche.csv","w"); rein?

    Also warumm ist Flaeche = fopen("Flaeche.csv","w") zwischen
    Seiten = fopen("Seiten.csv","r") und fclose(Seiten)?

    Was bringt das kannst du mir den Inhalt der sich dazwischen befindet erklären?



  • #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    int main()
    {
        FILE *Seiten=NULL;
        FILE *Flaeche=NULL;
        int i=0;
        int x=0;
        int a=0;
        int b=0;
        int ergebnis;
    
        Seiten = fopen("Seiten.csv","w"); // Datei zum Schreiben öffnen  
        if(Seiten == NULL)   // War das Öffnen erfolgreich?
        {
            printf("unable to write\n");
            exit(-1);
        }
        for(i=0; i <= 10; i++) // 10x wiederholen
        {
            a=rand(); // Zufallswert für a
            b=rand(); // Zufallswert für b
            fprintf(Seiten,"%d;%d\n", a, b); // Beide Zufallswerte in Datei schreiben
        }
        fclose(Seiten); // Datei wieder schließen
    
        Seiten = fopen("Seiten.csv","r"); // Datei zum Lesen öffnen
        if(Seiten == NULL) // Öffnen erfolgreich?
        {
            printf("unable to read\n");
            exit(-1);
        }
      Flaeche = fopen("Flaeche.csv","w");   // Eine weitere Datei zum Schreiben öffnen
        if(Flaeche == NULL)   // War das Öffnen erfolgreich?
        {
            printf("unable to write\n");
            exit(-1);
        }
    
        while(!feof(Seiten)) // Datei bis Ende (EOF = End Of File) auslesen
        {
            fscanf(Seiten,"%d;%d\n", &a, &b); // Inhalt in Variablen a und b lesen
            printf("%d -> %d\n", a, b); // Ausgeben
        ergebnis = a * b; // Flaeche berechnen
            fprintf(Flaeche,"ergebnis = %d\n\n", ergebnis); // Ergebnis in Datei Flache speichern
        }
        fclose(Seiten); // Dateien schließen
        fclose(Flaeche);
        return (0);
    }
    


  • Gegenfrage: Was bringt es dir überhaupt, deine Zwischenergebnisse in eine Datei zu speichern? DAfür verwendet man für gewöhnlich Arrays.

    Zu deiner Frage: Der erste Teil (Zeile 16 bis 28) öffnet die Datei "Seiten.csv" zum Schreiben, füllt sie mit Werten und schließt sie wieder. Der zweite Teil (Zeile 30 bis 51) öffnet die selbe Datei zum Lesen und eine andere Datei "Flaeche.csv" zum Schreiben, dann werden die am Anfang geschriebenen Datei-Inhalte wieder gelesen, miteinander verrechnet und das Ergebnis in die zweite Datei geschrieben.
    (theoretisch hättest du die "Seiten.csv" auch im Modus "w+" öffnen und nach dem Schreiben zum Anfang zurückspringen können)

    PS: Du gehst nicht zufällig in die selbe Klasse wie C_Boy?



  • CStoll schrieb:

    PS: Du gehst nicht zufällig in die selbe Klasse wie C_Boy?

    entweder das oder selber user 😃

    nachtrag von mir für a ---> add sollte der vollständigkeitshalber auch aufgelistet werden, egal ob gewünscht oder nicht.



  • a steht für append (anhängen, anfügen)



  • DirkB schrieb:

    a steht für append (anhängen, anfügen)

    ok! wieder was gelehrnt 😃 wird aber sicher kein fehler sein dies selber als Add zu werten. hat ja den selben Hintergrund.



  • maik81ftl schrieb:

    nachtrag von mir für a ---> add sollte der vollständigkeitshalber auch aufgelistet werden, egal ob gewünscht oder nicht.

    Ich hatte "a" in meiner ersten Antwort erwähnt (genau wie die Read/Write-Dateimodi) und es dann auf Wunsch des TE nicht weiter vertieft. In der Anwendung funktioniert es ähnlich wie "w", aber es löscht eine vorhandene Datei nicht sondern hängt alle geschriebenenen Daten an ihr Ende an.



  • Also in der while muss immer die Ausgabe stehn?
    Für was das scanf?

    Das Flaeche=fopen "w" ist deshalb im Seiten=fopen "r", weil man zuerst die Seiten LIEST und dann berechnet ---> in ein neues Dokument SCHREIBT ??



  • Mr.Gibbs123 schrieb:

    Also in der while muss immer die Ausgabe stehn?

    Nein, was du in deine while-Schleife packst, bleibt dir überlassen. In deinem Beispiel wird das while(!feof(Seiten)) genutzt, um wirklich den gesamten Inhalt der Datei zu erfassen (und diese Abbruchbedingung macht nur Sinn, wenn du in der Schleife aus der angegebenen Datei liest).

    Für was das scanf?

    Ich sehe da kein scanf(), nur ein fscanf() - und das funktioniert genauso wie scanf, nur mit einer Datei als DAtenquelle anstelle der STandard-Eingabe.

    Das Flaeche=fopen "w" ist deshalb im Seiten=fopen "r", weil man zuerst die Seiten LIEST und dann berechnet ---> in ein neues Dokument SCHREIBT ??

    Im Prinzip richtig, aber technisch würde ich nicht unbedingt von "im Seiten=fopen "r"" sprechen - diese fopen/fclose-Kombinationen definieren keinen Gültigkeitsbereich oder ähnliches und müssen auch nicht unbedingt ineinander geschachtelt werden. Du hast einfach zwei Dateien gleichzeitig geöffnet, um mit beiden arbeiten zu können.



  • Danke!
    Ich hab jetzt ein Programm geschrieben das eine sin(x) in ein Dokument ausgibt.
    Warum brauch ich hier kein "r"?

    Vielleicht kannst du die 2 Programm ein bisschen vergleichen?

    Also hab ich das richtig verstanden immer wenn man 2 gleichzeitig öffnen will dann muss man sie "ineinander" schreiben?

    #include <stdio.h>
    #include <math.h>
    
    int main (void)
    {
    	FILE * iofile = NULL;
    	float i=0;
    	iofile = fopen("sinus1.csv","w");
    
    	if(iofile == NULL)
    	{
    		printf("enable to write");
    		exit(-1);
    	}
    
    	for(i=0.1; i<=6; i=i+0.1)
    	{
    		fprintf(iofile,"sin(%2.1f)= ; %2.4f\n",i,sin(i));
    	}
    
    	fclose(iofile);
    
    	return(0);
    }
    


  • EDIT: Ich brauch auch keine while - Wann braucht man den so ne while?



  • Mr.Gibbs123 schrieb:

    Danke!
    Ich hab jetzt ein Programm geschrieben das eine sin(x) in ein Dokument ausgibt.
    Warum brauch ich hier kein "r"?

    Weil du hier nichts aus einer Datei lesen willst 😉

    Also hab ich das richtig verstanden immer wenn man 2 gleichzeitig öffnen will dann muss man sie "ineinander" schreiben?

    Die Dateien, die du in einem Programm öffnest, sind komplett unabhängig voneinander. Es kommt ganz auf deinen Anwendungsfall an, wie du sie zueinander in Beziehung setzt.

    Mr.Gibbs123 schrieb:

    EDIT: Ich brauch auch keine while - Wann braucht man den so ne while?

    Wenn du eine Schleife hast, bei der du nur ein Abbruchkriterium kennst.
    Aber rein technisch könnte man mit einer Schleifen-Konstruktion auskommen und die for()-, while()- und do-while()-Schleifen gegeneinander austauschen.

    PS: Übrigens gehst du vermutlich vom falschen Ende an die Sprache heran - bevor du dich mit der Dateibehandlung auseinandersetzt, solltest du erstmal die wichtigsten Sprachelemente von C verstanden haben.



  • Nehmen wir mal an, du willst den Inhalt von einer Flasche (A) in eine andere Flasche (B) schütten.

    Dann musst du zuerst die Flaschen öffnen. Welche du zuerst öffnest ist dabei egal.

    Und dann schüttest du solange noch etwas in Flasche A ist in Flasche B.

    Und Solange heißt auf Englisch while.



  • Mr.Gibbs123 schrieb:

    EDIT: Ich brauch auch keine while - Wann braucht man den so ne while?

    Entweder ist dies ein breitangelegter Test, der die Geduld der Hilfesteller auf die Probe stellen soll oder keines der Programme wurde von dir geschrieben.

    Du fragst warum "r" oder "w" gesetzt wird in einem Programm (von Dir?) und hast keine Ahnung von Kontrollstrukturen (wieso kein while()) in einem Programm (von Dir?).

    Damit hast du also gar kein Problem mit einem Fehler den du nicht findest, sondern du liest irgendwelche Beispiele und verstehst gar nicht was sie bedeuten.

    Die Grundbegriffe von C/C++ sollten vorhanden sein, BEVOR man von anderen verlangt alles vorzukauen!

    Neuer Rekord: Seit 24 Tagen ist es der 1. April!



  • forenseeker schrieb:

    Die Grundbegriffe von C/C++ sollten vorhanden sein, BEVOR man von anderen verlangt alles vorzukauen!

    Ach, C wäre in diesem Forum angemessen.
    C++ ist in dem anderen Forum da oben.
    Aber C/C++ ist böse. Mach das besser nicht.


Anmelden zum Antworten