File I/O



  • Hallo,

    ich hab hier ein Programm, dass den Xc, Xl(mittels einer Formel) und r ausrechnet.
    rlc.txt ist vorgegeben es steht drinnen:
    f 325
    r 545
    l 0,1545
    c 0,5464

    Und ich muss diese Zahlen bzw. Buchstaben auslesen und dann mit einer Formel ausrechnen und das Ergebnis in eine neue .txt schreiben.

    Die Frag ist nun:
    Ich muss ja die Zahl rauslesen die hinter dem jeweilige Buchstaben steht.

    Hier z.B liest es die Zahl hinter f in ff ein. Also speichert die Zahl hinter f in ff.

    if(a == 'f')
    {
      fscanf(file1,"%lf",&ff);
    }
    

    Das kapiere das nicht. Ich kann da gar nichts herauslesen wo es das was ich oben genannt habe machen soll.

    Kann mir wer bitte das mal erklären?

    Gruß

    Hier das Programm:

    #include <stdio.h>
    
    #define PI 3.14
    
    int main()
    {
    
      FILE * file1 = NULL;
      FILE * file2 = NULL;
    
      char a=0;
      double xl=0;
      double xc=0;
      double xr=0;
      double ff=0;
      double wertl=0;
      double wertc=0;
      double wertr=0;
    
      file1 = fopen("rlc.txt","r");
      if(file1 == NULL)
      {
        printf("Fehler beim Lesen!");
        exit(-1);
      }
    
      file2 = fopen("rlc2.txt","w");
      if(file2 == NULL)
      {
        printf("Fehler beim Schreiben!");
        exit(-1);
      }
    
      while(!feof(file1))
      {
        fscanf(file1,"%c",&a);
    
        if(a == 'f')
        {
          fscanf(file1,"%lf",&ff);
        }
    
        if(a == 'r')
        {
          fscanf(file1,"%lf",&wertr);
          fprintf(file2,"%lf\n",wertr);
          printf("%lf\n",wertr);
        }
    
        if(a == 'c')
        {
          fscanf(file1,"%lf",&wertc);
          xc=1/(2*PI*ff*wertc);
          fprintf(file2,"%lf\n",xc);
    			printf("%lf\n",xc);
        }
    
        if(a == 'l')
        {
          fscanf(file1,"%lf",&wertl);
          xl=2*PI*ff*wertl;
          fprintf(file2,"%lf\n",xl);
          printf("%lf\n",xl);
        }
      }
    
      fclose(file1);
      fclose(file2);
    
      return(0);
    }
    

  • Mod

    Das wichtigste hast du auch weg gelassen:

    fscanf(file1,"%c",&a);
    
        if(a == 'f')
        {
          fscanf(file1,"%lf",&ff);
        }
    

    In der ersten Zeile wird ein einzelnes Zeichen eingelesen. Dann und nur dann, wenn dieses Zeichen 'f' ist wird der Wert hinter diesem Zeichen gelesen. Und daher liest dieser Code den Wert hinter 'f'. Das Ganze steht dazu noch in einer Schleife, die die ganze Datei durchgeht (bis eof = end of file erreicht ist).



  • Ja ok, aber wenn ich so drauf schaue auf den Proggi-Ausschnitt den du gepostet hast sehe ich net das er das dahinter ausliest?

    Verstehe das net.

    Liest der einfach weiter nach f bis Zeile zu Ende ist?



  • fscanf liest die Daten soweit, wie es sie interpretieren kann - und merkt sich dabei auch wie weit es gelesen hat. Das heißt, als erstes liest du ein Zeichen ein ("%c") und wertest es dann aus um zu entscheiden, wie weitergemacht wird. Wenn dieses Zeichen ein 'f' war, trifft diese Bedingung zu und als nächstes wird der Rest der Zeile als double-Zahl ("%lf") gelesen.



  • Zum wiederholten Mal:
    fscanf ist NICHTS für Anfänger, schon gar nicht in Verbindung mit feof.
    Nimm fgets+sscanf und für deinen Fall noch setlocale, dann wird deine Aufgabe leichter zu lösen sein.



  • Ah ok danke.

    Aber ich habe noch ne Frage:

    Die Aufgabenstellung lautet:
    1. Ein Unterprogramm um die Zeilen in einem File zu zählen und ans
    Hautptprogramm zurueck zugeben. Ausgabe im Hauptprogramm.
    Übergabeparameter: char filename[]
    Rückgabeparameter: int

    1. Ein Unterprogramm um die Zeilen im File durchzusuchen und alle Zeilen die
    mit einem # beginnen in ein neues File mit dem Namen "komment.txt"
    zu schreiben.
    Übergabeparameter: char filename[]
    Rückgabeparameter: ---

    Es hat auch geheißen das man den Namen der Files übergeben muss.

    char filename[20]="2bhel10_test3.txt";
    // und
    char filename1[20]="komment.txt";
    

    Was bringt das was macht das genau?

    Grüße

    Das Programm selber:

    #include <stdio.h>
    #include <stdlib.h>
    
    #define MAXSTRLEN 40
    
    /* unterprogramm zum zaehlen der zeilen
     * in: der dateiname der angabedatei
     * out: die anzahl
     */
    int count(char filename[]);
    
    /* unterprogramm zum suchen der zeilen, die mich einem # beginnen
     * in: der dateiname der angabedatei
     * out: ---
     */
    void searchforhash(char filename[]);
    
    int count(char filename[])
    {
    	int anzahl=0;	
    	char temp[MAXSTRLEN];	
    
    	FILE*fileio=NULL;	
    	fileio=fopen(filename,"r");	
    	if(fileio==NULL)	
    	{
    		printf("fehler beim einlesen!");
    	}
    
    	while(!feof(fileio))	
    	{
    		fscanf(fileio,"%s\n",&temp);	
    		fflush(stdin);
    
    		anzahl++;
    	}
    
    	fclose(fileio);	
    
    	return(anzahl);	
    }
    
    void searchforhash(char filename[])
    {
    	char temp[MAXSTRLEN];	
    	char filename1[20]="komment.txt";	
    
    	FILE*fileio1=NULL;	
    	FILE*fileio2=NULL;	
    
    	fileio1=fopen(filename,"r");	
    	if(fileio1==NULL)	
    	{
    		printf("fehler beim einlesen!");
    	}
    
    	fileio2=fopen(filename1,"w");	
    	if(fileio2==NULL)
    	{
    		printf("fehler beim einlesen!");
    	}
    
    	while(!feof(fileio1))
    	{
    		fscanf(fileio1,"%s\n",&temp);	
    		fflush(stdin);
    
    		if(temp[0]=='#')	
    		{
    			fprintf(fileio2,"%s\n",temp);
    		}
    	}
    
    	fclose(fileio1);
    	fclose(fileio2);
    
    	return;
    }
    
    int main(void)
    {
    	char filename[20]="2bhel10_test3.txt";	
    	int anzahl1=0;	
    
    	anzahl1=count(filename);
    	printf("die anzahl ist: %d\n\n",anzahl1);
    
    	searchforhash(filename);	
    
    	return(0);
    }
    


  • Hast du das selber geschrieben? Wenn ja, solltest du nochmal von vorne anfangen.

    * fscanf() hört beim ersten Whitespace auf mit der Eingabe, das heißt deine Funktionen arbeiten nicht zeilenweise, sondern wortweise.

    • fflush(stdin); ist für manche bereits ein Grund, die zu vierteilen (und dort, wo du es verwendest, hast du noch nicht einmal mit stdin zu tun)
      * wenn du schon beim Öffnen der Dateien einen Fehler feststellst, macht es wenig Sinn, trotzdem mit ihnen zu arbeiten

    PS: Und Anweisungsfolgen wie int anzahl=0;anzahl=count(filename); könntest du auch zu einer direkt-Initialisierung zusammenfassen 😉



  • fscanf liest die Daten soweit, wie es sie interpretieren kann - und merkt sich dabei auch wie weit es gelesen hat. Das heißt, als erstes liest du ein Zeichen ein ("%c") und wertest es dann aus um zu entscheiden, wie weitergemacht wird. Wenn dieses Zeichen ein 'f' war, trifft diese Bedingung zu und als nächstes wird der Rest der Zeile als double-Zahl ("%lf") gelesen.

    Und

    fscanf(file1,"%c",&a);
    

    Liest Zeile für Zeile? (Also wenn 1. Zeile zu Ende ist dann geht sie in die 2.?)

    fscanf(file1,"%c",&a);
    
        if(a == 'f')
        {
          fscanf(file1,"%lf",&ff);
        }
    

    Warum liest das nur die Zeile wo f drinnen steht? Und geht nicht in die nächste Zeile?



  • C-Anfänger005 schrieb:

    fscanf(file1,"%c",&a); //liest ein einzelnes Zeichen nach a
    
        if(a == 'f')       //nur wenn dieses Zeichen (a) gleich 'f' ist, dann
        {
          fscanf(file1,"%lf",&ff); //wird hier weitergelesen (eine Fließkommazahl)
        }
    


  • int count(const char *dateiname)
    {
      int z=0,c;
      FILE *f=fopen(dateiname,"r");
      if( f )
      {
        while( (c=fgetc(f))!=EOF )
          if( c=='\n' ) ++z;
        fclose(f);
      }
      return z;
    } /* endende Dateizeilen ohne '\n' bleiben unberücksichtigt */
    


  • int searchforhash(const char *dateiname)
    {
      int z=0,c,x='\n';
      FILE *f=fopen(dateiname,"r");
      if( f )
      {
        while( (c=fgetc(f))!=EOF )
        {
          if( x=='\n' && c=='#' ) ++z;
          x=c;
        }
        fclose(f);
      }
      return z;
    }
    


  • char zeile[100],c;
    double d;
    FILE *f=fopen("datei.txt","r");
    if( f && setlocale(LC_ALL,"deu") )
    {
      while( fgets(zeile,100,f) )
        if( 2==sscanf(zeile,"%c%lf",&c,&d) )
          printf("%c ==>> %f\n",c,d);
      fclose(f);
    }
    

Anmelden zum Antworten