Warum geht das nicht? If Abfrage



  • hallo, ich habe dieses kleiner programm:

    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <termios.h>
    #include <stdio.h>
    #include <math.h>
    
    int main(void){
        FILE *fp;
    	unsigned char line[400];
    	unsigned char buf[400];
    	int i;
    
    	fp = fopen("mrecord1", "r");
    
        while((fgets(line, sizeof line, fp)) != NULL){
    
    		//printf("%s", line);
    
        	for(i=0;i<sizeof(line);i++){
    
    			buf[i]=line[i+1];
    
    			if(buf[i]==31){
    				printf("%s","HALLO");
    				buf[i]='\n';
    				return;
    			}
    		}
    
    		printf("%s", buf);
    		printf("\n");
    	}
    	fclose(fp);
    
    	return 0;
    }
    

    die datei mrecord1 sieht so aus:

    0 10 0 0 35 44 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 0 78 240
    0 10 0 0 50 50 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 0 141 240
    0 10 0 0 53 55 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 0 97 240
    0 10 0 0 55 54 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 0 161 240
    0 10 0 0 53 53 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 0 114 240
    0 10 0 0 52 50 0 0 0 0 0 0 0 0 0 0 0 0 0 32 0 31 0 229 240
    0 10 0 0 47 45 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 0 146 240
    0 10 0 0 41 41 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 0 184 240
    0 10 0 0 38 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 0 61 240
    0 10 0 0 202 224 29 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 0 194 240
    0 10 0 0 28 28 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 0 3 240
    0 10 0 0 29 29 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 0 197 240
    0 10 0 0 29 30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 0 18 240
    0 10 0 0 202 224 32 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 0 95 240
    0 10 0 0 33 33 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 0 228 240
    0 10 0 0 33 32 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 0 32 240
    0 10 0 0 202 224 30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 0 21 240
    0 10 0 0 29 27 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 202 15 240
    0 10 0 0 27 25 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 0 239 240
    0 10 0 0 23 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 0 157 240
    0 10 0 0 19 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 0 179 112
    0 43 31 0 103 240
    0 10 0 0 17 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 0 254 240
    0 10 0 0 14 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 240 0 10
    0 0 11 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 255 240 0 10 0 0 10 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 0 85 240
    0 10 0 0 7 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 0 242 240
    0 10 0 0 5 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 0 229 240
    0 10 0 0 4 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 0 22 240
    0 10 0 0 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 0 222 240
    0 10 0 0 3 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 0 45 240
    0 10 0 0 11 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 0 97 240
    0 10 0 0 202 224 202 224 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 0 60 240
    0 10 0 0 40 47 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 0 143 240
    0 10 0 0 52 55 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 0 99 240
    0 10 0 0 56 56 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 0 198 240
    0 10 0 0 55 55 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 0 101 240
    0 10 0 0 53 52 0 0 0 0 0 0 0 0 0 0 0 0 0 32 0 31 0 210 240
    0 10 0 0 50 50 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 0 141 240

    er soll ab der 31 die zeile umbrechen und die anderen zahlen danach nicht mit ausgeben! aber er geht nicht in die if abfrage rein, obwohl 31 ja offensichtlich drin steht!?!

    DANKE:-)



  • Darf ich mal anmerken, dass fgets() zeichenweise(!) einliest.

    D. h. wenn in einer Textdatei 31 drinsteht (du das also so z. B. im notepad lesen kannst), dann liest fgets() einmal die 3 als Zeichen (also '3') und dann die 1 als Zeichen (also '1').

    Beispiel:

    Textdatei:

    0314

    Wenn du nun einliest mit fgets() nach line, dann steht in line folgendes drin:

    line[0] = '0'
    line[1] = '3'
    line[2] = '1'
    line[3] = '4'
    line[4] = 0 //bzw. '\0' ('0' != '\0')

    Verständlich, was ich dir damit sagen will??



  • AJ, auch wenn ein ! dahintersteht, sollte es nicht 'zeilenweise' statt 'zeichenweise' heissen?
    (Kompromiss: fgets liest zeilenweise Zeichen)



  • @Bitsy
    Hast schon recht. Hab mich nur etwas falsch ausgedrückt. Ich wollte mit zeichenweise klarstellen, dass fgets() Zeichen einliest und nicht Zahlen.



  • War mir schon klar. Hab's nur geschrieben, damit er der Sache näher kommt.

    @Devil123:
    Nur um aufzuzeigen, welche Problematiken Dir bei der Technik noch bevorstehen:
    Kannst Du sicherstellen, dass keiner der anderen Werte eine 31 annimmt, die Dein Programm dann irreleiten würden? Der Zeichenabstand vom Zeilenanfang bis zu einer möglichen 31 ist auch variabel, kann nicht herangezogen werden. Du musst die Einträge einer Zeile beim Suchen nach der 31 mitzählen! (Ich denke mal, diese Anzahl ist stabil).

    Beispiel einer sehr vereinfachten Routine, die nachschaut, ob eine 31 an der Stelle drin ist:

    char* check31(char* from)  // gib line an from
    {
      int counter = 0;
    
      while (*from != '\0' && *from != '\n' && *from != '\r')
      {
        testwert = atoi(from);
        if (testwert == 31 && counter == 21)  // unschön mit den Konstanten
          return 1;
    
        while (*from >= '0' && *from <= '9')  // naja naja ... und negativ?
          from++;
        if (*from == ' ') // und über das Blank hüpfen (angenommen, es ist da...)
          from++; 
        counter++;
      }
    
      return 0;
    }
    

Anmelden zum Antworten