Nicht vorhandene Zeichen werden eingelesen.
-
Hallo Zusammen
Ich habe ein Textfile, welches insgesamt 32 Ziffern pro Zeile hat und 24 Zeilen.
Dieses sieht z.B so aus:00000000000000000000000000000000 11111111111111111111111111111111 22222222222222222222222222222222 33333333333333333333333333333333 00000000000000000000000000000000 11111111111111111111111111111111 22222222222222222222222222222222 33333333333333333333333333333333 00000000000000000000000000000000 11111111111111111111111111111111 22222222222222222222222222222222 33333333333333333333333333333333 00000000000000000000000000000000 11111111111111111111111111111111 22222222222222222222222222222222 33333333333333333333333333333333 00000000000000000000000000000000 11111111111111111111111111111111 22222222222222222222222222222222 33333333333333333333333333333333 00000000000000000000000000000000 11111111111111111111111111111111 22222222222222222222222222222222 33333333333333333333333333333333Nun lese ich sie folgendermassen ein:
int arraymap[32][24]; /* Zeichen für Zeichen einlesen */ int inputChar = 0; for(int j=0;j<=23;j++) { for(int i=0;i<=31;i++) { if(inputChar != EOF || inputChar != '\n' || inputChar != '\0') { inputChar = fgetc(datei); switch(inputChar) { case '0': arraymap[i][j] = 0; break; case '1': arraymap[i][j] = 1; break; case '2': arraymap[i][j] = 2; break; case '3': arraymap[i][j] = 3; break; case '4': arraymap[i][j] = 4; break; case '5': arraymap[i][j] = 5; break; case '6': arraymap[i][j] = 6; break; case '7': arraymap[i][j] = 7; break; case '8': arraymap[i][j] = 8; break; case '9': arraymap[i][j] = 9; break; default: arraymap[i][j] = inputChar; break; } } else{inputChar++;} } } }Eigentlich sollte die default-Anweisung ja nie greifen. Wenn ich mir aber den Inhalt von jedem Array ausgebe habe ich in regelmässigen Abständen die Ziffern 10 und 13 hintereinander und zwar genau nach 32 normalen Ziffern.
Wenn ich nun diese Ziffern als char ausgebe (printf("%c, %c",10,13)) bekomme ich folgendes:
<cr>, (Wahrscheinlich ein Leerschlag)Kann mir jemand sagen, was <cr> bedeutet und wie ich die zwei Zeichen rausfiltere?
Danke
-
Die Kombo 10 + 13 repräsentiert unter Windows das NewLine-Zeichen. Irgendwie muss der Editor ja auch erkennen können, dass du in die nächste Zeile gegangen bist.
Filtern kannst du sie ganz einfach: Du baust sie auch ins Switch ein und ignorierst sie:
case 10: case 13: /* do nothing */ break;MfG SideWinder
-
das ist das \n und \r zeichen. das musst du auch noch rausfiltern.
//edit side war schneller und besser als ich

-
Hmmm seltsam
Ich habe jetzt folgendes in die switch Anweisung eingefügt:
/* 10 & 13 sind Steuerzeichen von Windows --> Tue nichts */ case 10: break; case 13: break;Und jetzt ists ganz lustig:
Ich bekomme verschiedenste Zahlen an den Orten, wo vorher die 10 & 13 standen z.B.
-1209902528 -1208807925
-
Dein Code ist überhaupt etwas sehr komisch:
if(inputChar != EOF || inputChar != '\n' || inputChar != '\0') { inputChar = fgetc(datei);Sollte das nicht umgekehrt da stehen?
inputChar = fgetc(datei); if(...) // Nur wenn kein EOF, kein 0 und kein \n // (BTW: \n wär eins von denen die du gerade im switch aussortiert hast, wie du siehst hat dein if so keinen Sinn)Dein switch ist vollkommen überflüssig, '0' bis '9' stehen genau 48 Zeichen nach dem Beginn garantiert hintereinander im Zeichensatz, also reicht sowas auch:
if(inputChar >= '0' && inputChar <= '9') // oder isnumber(inputChar) arraymap[i][j] = inputChar - '0';Und was soll das hier:
} else{inputChar++;} }Hier kommen höchstwahrscheinlich deine komsichen Zeichen her. Sollte ein Zeichen tatsächlich mal \n, etc. gewesen sein dann wird beim nächsten Mal dieser Schrott ausgeführt. Dann sit die if-Abfrage wieder richtig und inputChar wird benützt. Oder so ähnlich. Auf jeden Fall Unfug.
Wie gesagte meine Version würde so aussehen:
int arraymap [32][24]; char inputChar = 0; for(int j = 0; j < 24; ++j) { for(int i = 0; i < 32; ++i) { inputChar = fgetc(datei); if(inputChar >= '0' && inputChar <= '9') arraymap[i][j] = inputChar - '0'; else arraymap[i][j] = 0; } }MfG SideWinder
-
Die seltsamen Zeichen sind zwar wieder aufgetaucht aber mit dem neuen Code wars viel einfacher zu lösen:
/* Zeichen für Zeichen einlesen */ char inputChar = 0; for(int j = 0; j < 24; ++j) { for(int i = 0; i < 32; ++i) { /* Zeichen einlesen */ inputChar = fgetc(datei); /* Überprüfen ob es eine erlaubte Ziffer ist*/ if(inputChar >= '0' && inputChar <= '9' && inputChar != 10 \ && inputChar != 13 && inputChar != '\n' && inputChar != '\0') { /* Dem Array den richtigen Wert zuweisen */ arraymap[i][j] = inputChar - '0'; } else { /* Falls inputChar ein nicht erlaubtes Zeichen ist, i zurücksetzen und mehr Glück beim nächsten Versuch haben*/ i--; } } }Danke
