Datei einlesen mit Kriterien



  • Hallo,
    ich will eine Datei einlesen unter folgenden Kriterien:
    -Es dürfen nur 9 Spalten und 9 Zeilen sein
    Bsp:
    060000000
    700050010
    380000007
    000000700
    000000006
    005900000
    002000090
    000007004
    000036000
    (d.h. falls es irgendwo 10 Zeichen sind wird eine Fehlermeldung ausgegeben)
    -Es muss Linux sowohl auch Windows Textdateien lesen können im bezug auf Zeilenumbruch
    -Es dürfen nur Zahlen enthalten sein

    Die Funktion, die ich bisher habe hat das Problem, dass sie nur den Windowszeilenumbruch erkennt und sonst nichts ausfiltert...
    Die Rohfunktion steht also schon, nur weiß ich nicht wie ich die anderen Eigenschaften hineinschreiben soll

    int readfile(char outfile[50], sudoku *feld){
      FILE *fp;
      int i, j;
      char temp[9+2] = {0};
    
      fp = fopen(outfile, "r");
      if(fp == NULL) {
        printf("Datei %s wurde nicht gefunden!\n", outfile);
        return -1;
      }
    
      for(i = 0; i < 9; i++) {
        if(fgets(temp, 9 + 2, fp) == NULL) {
          printf("Daten sind nicht vollstaendig!\n");
          fclose(fp);
          return -1;
        }
        for(j = 0; j < 9; j++) {
          feld->feld[i][j] = temp[j] - '0';
        }
      }
    
      fclose(fp);
    
      return 0;
    }
    

    Gruß 🙂



  • int readfile(char outfile[50], sudoku *feld){
      FILE *fp;
      int i=-1, j;
      char temp[9+1] = {0};
    
      fp = fopen(outfile, "rt");
      if(fp == NULL) {
        perror(outfile);
        return -1;
      }
    
      while( !feof(fp) )
        if( 1==fscanf(fp,"%9[0-9]",temp) && i<9 )
          for(++i,j = 0; j < 9; j++)
            feld->feld[i][j] = temp[j] - '0';
      fclose(fp);
    
      if( 8!=i )
        return puts("Daten sind nicht vollstaendig!"),-1;
    
      return 0;
    }
    


  • if( 8!=i )
      return puts("Daten sind nicht vollstaendig!"),-1;
    

    Das muss so heissen:

    if (i != 8) {
            puts ("Daten sind nicht vollstaendig!");
            return EXIT_FAILURE;
    }
    
    while( !feof(fp) )
      if( 1==fscanf(fp,"%9[0-9]",temp) && i<9 )
        for(++i,j = 0; ...
    

    Das erzeugt zwingend eine Endlosschleife (zum Beispiel ignoriert es Newlines oder hört bei falschen Zeichen auf zu lesen).

    Daher: Verlasse dich nicht auf scanf, schreib in Bedingungen die Konstante an den Ort, wo sie hingehört (rechts) und versuch nicht irgendwelche Zeichen einzusparen, wo das nur in Unverständnis und infolgedessen Bugs endet (nicht einmal Wutz selber scheint da durchzusteigen).
    Verlasse dich dafür auf mich und meine Code:

    int readfile(const char *filename, sudoku *s)
    {
    	FILE *f;
    	int i, j;
    	char buf[11], *c;	/* 9 Zahlen + 1x'\n' + 1x'\0' */
    
    	if (!(f = fopen(filename, "r"))) {
    		perror(filename);
    		return EXIT_FAILURE;
    	}
    
    	for (i = 0; i < 9 && fgets(buf, sizeof(buf) / sizeof(buf[0]), f); ++i)
    		for (c = buf, j = 0; *c; ++c, ++j)
    			if (isdigit(*c))
    				s->feld[i][j] = *c - '0';
    			else if (*c != '\n') {
    				fprintf(stderr, "fehler\n");
    				fclose(f);
    				return EXIT_FAILURE;
    			}
    
    	if (!feof(f) && fgetc(f) != '\n' && !feof(f))
    		fprintf(stderr, "fehler\n");
    	fclose(f);
    
    	return EXIT_SUCCESS;
    }
    

Anmelden zum Antworten