File I/O



  • 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