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 seinDie 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 sollint 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; }