File I/O(fscanf,....)



  • Guten Morgen zusammen,

    hier sind 2 Programme eins mit "for" geschrieben und eins mit "while". Sie sind gleich nur das bei einem Programm halt die Flaechen sortiert werden, aber das ist unwichtig.

    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);
    }
    

    Ok ich probier mal das zu erklären: Also, die while läuft so lange bis sie das Ende von Seiten.csv erreicht hat(also die letzte Zeile?). Das fscanf liest Zeile für Zeile heraus: z.B. 3 4 ---> 3*4=12 ---> speichert es in Flaeche.csv. Und das wie gesagt bis zur letzen Zeile von Seiten.csv.

    Und jetzt versuch ich erklären das int main von beiden Programm das ist ja fast gleich:
    Ich schreibe die verschieden Zufallszahlen auf einen 1. Zettel mit fopen(...."w") ----> Ich legen den Zettel weg also flclose(.....). Ich denke mir: Na toll jetzt hab ich die "Zufallszahlen" vergessen :D. *Gedankenblitz* Ich hole mir den 1. Zettel wieder und LESE ihn durch: fopen(....."r"). Jetzt nehme ich einen neune Zetteln den 2. während der 1. Zettel nicht geclost ist kann ich die werten für a und b ABLESEN und SCHREIBE dann das Ergebnis auf den 2. Zettel.

    Wenn ich mir die 2 Programme jetzt anschaue, frag ich mich: Für was brauch ich so eine while und ein fscanf? Wenn es doch mit for auch geht?

    Alleine schon das "r" das ich oben beschrieben hab lest ja schon Zeilen in Seiten.csv oder?

    Stimmt das was ich da so erzähle :p ?

    MfG Gast

    Hier das 1. mit der "while":

    #include <stdio.h>
    #include <stdlib.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);
    }
    

    Hier das 2. mit der "for"(sortiert Flaechen):

    #include <stdio.h>
    #include <stdlib.h>
    
    #define MAX_ANZAHL 10
    
    void sort(int fl[]);
    void sort(int fl[])
    {
      int hilf=0;
      int x;
     int i;
    
     for(x=0; x<MAX_ANZAHL; x++)
     {
       for(i=0; i<MAX_ANZAHL-1; i++)
      {
        if(fl[i+1] < fl[i])
       {
         hilf=fl[i];
        fl[i]=fl[i+1];
        fl[i+1]=hilf;
       }
      }
     }
    }
    
    int main()
    {
      FILE*seiten = NULL;
     FILE*flaeche = NULL;
    
     int a[MAX_ANZAHL];
     int b[MAX_ANZAHL];
     int fl[MAX_ANZAHL];
     int i;
     int hilf;
    
     seiten = fopen("seiten.csv","w");
      if(seiten == NULL)
     {
       printf("unable to write");
      exit(-1);
     }
    
     for(i=0; i<MAX_ANZAHL; i++)
     {
       a[i]=rand()%10;
      b[i]=rand()%10;
      fprintf(seiten,"%d ; %d\n",a[i],b[i]);
     }
     fclose(seiten);
    
     seiten = fopen("seiten.csv","r");
      if(seiten == NULL)
     {
       printf("unable to read");
      exit(-1);
     }
    
     flaeche = fopen("flaeche.csv","w");
     if(seiten == NULL)
     {
       printf("unable to write");
      exit(-1);
     }
    
      for(i=0; i<MAX_ANZAHL; i++)
     {
        fl[i]=a[i]*b[i];
        fprintf(flaeche,"flaeche: ; %d\n",fl[i]);
        printf("flaeche: ; %d\n",fl[i]);
     }
     sort(fl);
     for(i=0; i<MAX_ANZAHL; i++)
     {
      fprintf(flaeche,"flaeche: ; %d\n",fl[i]);
      printf("%d\n",fl[i]);
    
     }
    
     fclose(seiten);
     fclose(flaeche);
    
     return(0);
    }
    


  • Gast007 schrieb:

    Alleine schon das "r" das ich oben beschrieben hab lest ja schon Zeilen in Seiten.csv oder?

    Ägypten?

    Wo liest du denn nach

    seiten = fopen("seiten.csv","r");
    

    irgendwas aus der Datei?
    fopen macht fopen und keinerlei Leseaktion.



  • Bei deinem zweiten Programm hast du zwar die seiten.csv zum Lesen geöffnet, nutzt aber dann trotzdem die Arrays, die du beim Schreiben dieser Datei gefüllt hast. Also könntest du theoretisch auf diese Datei komplett verzichten.
    Für diese Dateimengen macht es sowieso wenig Sinn, sie noch extra in Dateien auszulagern, da reicht der RAM deines Rechners vollkommen aus.

    Ansonsten: for()- und while()-Schleife sind nahezu* verlustfrei ineinander umwandelbar, aber üblicherweise nimmt man die Schleife, die im Zusammenhang verständlicher ist. Wenn du "nur" weißt, wann die Schleife zu Ende sein soll, verwendest du while(), bei einer Index-artigen Struktur verwendest du for(). Aber es ginge auch umgekehrt:

    for(;!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);
    }
    
    i=0;
    while(i<MAX_ANZAHL)
    {
      fl[i]=a[i]*b[i];
      fprintf(flaeche,"flaeche: ; %d\n",fl[i]);
      printf("flaeche: ; %d\n",fl[i]);
      ++i;
    }
    

    *Es gibt ein paar subtile Unterschiede im Zusammenhang mit continue, aber die sind hier nicht von Bedeutung.



  • Das hat bei dir mit for und while nichts zu tun.

    Im 1. Programm nutzt du eine Datei als Zwischenspeicher.
    Das ist gut, wenn man die Daten nach dem Programmlauf noch braucht.

    Im 2. Programm speicherst du die Daten in einem Array zwischen.
    Die sind beim Programmende weg.

    while und for kann man ohne Probleme gegeneinander austauschen.

    for wird meist für Schleifen benutzt, wo die Anzahl der Durchläufe vorher feststeht.
    while nimmt man, wenn die Abbruchbedingung in der Schleife ermittelt wird.

    Du weißt wie viel Einträge dein Array hat -> for
    Du weißt nicht wie viel Zeile die Datei hat -> while

    Das ist aber nicht zwingend.



  • Wutz schrieb:

    Gast007 schrieb:

    Alleine schon das "r" das ich oben beschrieben hab lest ja schon Zeilen in Seiten.csv oder?

    Ägypten?

    Wo liest du denn nach

    seiten = fopen("seiten.csv","r");
    

    irgendwas aus der Datei?
    fopen macht fopen und keinerlei Leseaktion.

    Ich dachte wenn man seiten zum lesen öffnet also: seiten=fopen(".......","r"), dann "lest" "irgendwer" (der Compiler?!) die Seiten durch und wenn ich dann gleichzeitig
    flaeche = fopen("........","w") öffne dann kann man ja sagen das beide Zettel nebeneinander liegen. Man liest "r" von seiten.csv die zahlen und "schreibt" "w" sie dann in flaeche.csv.

    Stimmt das?

    Was ist nun der Unterschied zwischen fscanf und eine file zum lesen öffne("r")?

    Wie man in den 2 Programm gesehn hat ist der Aufbau mit dem "w" und "r" ja gleich und es geht auch ohne fscanf.



  • Gast007 schrieb:

    Ich dachte wenn man seiten zum lesen öffnet also: seiten=fopen(".......","r"), dann "lest" "irgendwer" (der Compiler?!) die Seiten durch und wenn ich dann gleichzeitig
    flaeche = fopen("........","w") öffne dann kann man ja sagen das beide Zettel nebeneinander liegen. Man liest "r" von seiten.csv die zahlen und "schreibt" "w" sie dann in flaeche.csv.

    Nein, mit fopen() sagst du dem Rechner nur, daß du gerne diese Datei lesen bzw. schreiben willst. Das Lesen/Schreiben mußt du dann selber erledigen, wenn du es benötigst (es gibt noch andere Lese-Funktionen als fscanf(), von den Möglichkeiten unterschiedlicher Format-Strings und Zielvariablen gar nicht zu sprechen.

    Um mal bei deiner Analogie mit den Zetteln zu bleiben: mit fopen() holst du einen Zettel aus dem Aktenordner, mit fscanf() nimmst du diesen Zettel und schaust dir seinen Ihnalt an.

    Wie man in den 2 Programm gesehn hat ist der Aufbau mit dem "w" und "r" ja gleich und es geht auch ohne fscanf.

    Das funktioniert auch nur, weil du die Daten weiter oben in einem Array untergebracht hast und weiter genutzt hast (d.h. du hast die Zahlen nicht vergessen, sondern erinnerst dich noch daran, wie du sie geschrieben hast - also brauchst du nicht auf deinen Zettel gucken).



  • Sich die Sache so einfach wie möglich zu machen ist oft gut nur man darf da aber nichts vernachlässigen.

    Was ist denn das Aufgabenziel?

    Soll eine "seiten.csv" erstellt werden z.B. zur Dokumentation?
    Wenn nein, das haben die Schreiber vor mir allerdings schon geschrieben, kannst du dir das Dateien-Handling sparen.

    Soll zu Übungszwecken eine "seiten.csv" erstellt werden, dann teile dein Programm:
    erst schreibst du ein Programm welches nur die "seiten.csv" erstellt. Wenn das zuverlässig läuft, schreibst du eines welches die "seiten.csv" nur liest und die Daten dann weiter verarbeitet. An diesen beiden Programmen kannst du dann das testen mit dem weglassen und so. Dies damit du weisst wieso der Quelltext den Weg in dieser Form zu dir gefunden hat 🤡

    MfG f.-th.



  • f.-th. schrieb:

    Was ist denn das Aufgabenziel?

    Also die Aufgabenstellung ist: 1 File(seiten.csv) erstellen wo nur die Seiten also a und b gespeichert werden und 1 File(flaeche.csv) wo nur die Flächen gespeichert werden.

    PS: Fällt euch zufällig ein paar gleichgewichtige Aufgabenstellungen ein?



  • Danke an alle. Habt mir sehr geholfen 🙂

    Ahja kann es sein das fscanf nur aus jener Datei was ausliest wo der Lese-Modus benutz wird also w+, a+, r...?

    z.B: seiten = fopen(".......","r"). r kann man halt durch w+, a+... ersetzen.



  • Kann man das so sagen :D?



  • Gast007 schrieb:

    Ahja kann es sein das fscanf nur aus jener Datei was ausliest wo der Lese-Modus benutz wird also w+, a+, r...?

    Lass dir diesen Satz noch mal auf der Zunge zergehen.
    Fällt dir etwas auf?



  • Das "r" es lest und fscanf das aus derjenigen Datei liest?



  • Das "r" bei fopen steht für read
    Damit du Daten aus einer Datei lesen kannst, musst du sie so öffnen, dass du lesen kannst. Und das macht bei fopen "r" bzw. die Parameter mit + dabei.

    fopen ändert nur etwas an der Datei im Modus "w". Es setzt die Dateilänge auf 0.


Log in to reply