problem mit EOF:



  • Es soll von einer textdatei eingelesen werden (zeilenweise), betsimmte wörter in struktur attribute geschrieben werde, dann die struktur binär in ne andere datei abgespeichert werden.

    es klappt zwar sowieso noch nicht, aber so wie es jetzt angezeigt wird,macht er es wenigstesn für eine zeile (abe rnoch mit fehlern), jedoch wenn ich die auskommentierung wegnehme, müsste er es doch für alle zeilen machen ?

    Vor allem wenn ich anstat der while schleife 8die auskommentierte) ne for schleife nehme,dann macht er auch bei 2 durchläufen 2 zeilen hintereinander, wieso geht es aber so dann nicht ?

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char *argv[])
    {
      struct kunde
      {
      unsigned int nummer;
      char name[21];
      char ort[21];
      char plz[6];
      char strasse[21];
    };
        struct kunde kunde1;
        FILE * Lesen=fopen("daten.txt","r"); 
        FILE * Schreiben=fopen("datenNeu.txt","wb"); 
    
        char help[80]={' '};
        int j=0,i=0,index=0;
    
        if (Lesen==NULL) perror ("Error opening file");
        else
        { 
     //     while(help[i] != EOF){
    
          i=0;
          index=0;
          j=0;
    
         	while(help[i-1] != EOF && help[i-1] != '\n'){
    			help[i] = fgetc(Lesen);
    			i++;
    			}
    
          kunde1.nummer=atoi(help);                 // Indexzahl auf .nummer schreiben
    
          do {
          index++;
          } while (help[index] != ',');
    
          for(j=0;j<21;j++) {                       // kunde1.name auf leerzeichen setzen,aber länger als 21 ???
          kunde1.name[j]=' ';  
          kunde1.ort[j]=' ';
          }
    
          index++;i=0;
          do {
          kunde1.name[i+1]=help[index];
          index++,i++;                              // Namen auf .name schreiben
          } while (help[index] != ',');
          kunde1.name[0]=i;
    
          index++;i=0;
          do {
          kunde1.ort[i+1]=help[index];
          index++,i++;                              // Ort auf .ort schreiben
          } while (help[index] != ',');
          kunde1.ort[0]=i;
    
          index++;i=0;
          do {
          kunde1.plz[i+1]=help[index];
          index++,i++;                             // PLZ auf .plz schreiben
          } while (help[index] != ',');
          kunde1.plz[0]=i;
    
          index++;i=0;
          do {
          kunde1.strasse[i+1]=help[index];
          index++,i++;                              // Strasse auf .strasse schreiben            
          } while (help[index] != '\n');
          kunde1.strasse[0]=i;
    
          fwrite(&kunde1, sizeof(kunde1),1,  Schreiben);
    
    //}  
          }
    
        printf("\n\n");
        printf("Nummer: %d\n",kunde1.nummer);
        printf("Name: %s\n",kunde1.name);
        printf("Ort: %s\n",kunde1.ort);
        printf("PLZ: %s\n",kunde1.plz); 
        printf("Strasse: %s\n",kunde1.strasse); 
    
        fclose (Lesen);                           // schliessen der beiden FILE´s
        fclose (Schreiben); 
    
      system("PAUSE");	
      return 0;
    }
    

    meine textdatei sieht so aus:

    123,ramon lembicz,iserlohn,58636,gruener weg 611
    92,daniel lembicz,iserlohn,58644,gruener weg 61
    3,peter pan,dortmund,66644,musterstrasse 2
    4,peter butzenbar,dortmund,66644,musterstrasse 252



  • #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char *argv[]) {
    	struct kunde {
    		unsigned int nummer;
    		char name[21];
    		char ort[21];
    		char plz[6];
    		char strasse[21];
    	} kunde1;
    
    	int j, i;
    	FILE *Lesen = fopen("daten.txt", "r");
    
    	if (Lesen == NULL) {
    		perror ("Error opening file");
    	}
    
    	while ((i = fgetc(Lesen)) != EOF) {
    		do {                                             // Nummer
    			kunde1.nummer *= 10;
    			kunde1.nummer += i - '0';
    		} while ((i = fgetc(Lesen)) != ',');
    
    		for (j = 0; (i = fgetc(Lesen)) != ',';) {        // Name
    			kunde1.name[j++] = i;
    		}
    		kunde1.name[j] = '\0';                           // String abschließen
    
    		for (j = 0; (i = fgetc(Lesen)) != ',';) {        // Ortschaft
    			kunde1.ort[j++] = i;
    		}
    		kunde1.ort[j] = '\0';
    
    		for (j = 0; (i = fgetc(Lesen)) != ',';) {        // PLZ
    			kunde1.plz[j++] = i;
    		}
    		kunde1.plz[j] = '\0';
    
    		for (j = 0; (i = fgetc(Lesen)) != '\n';) {       // Strasse
    			kunde1.strasse[j++] = i;
    		}
    		kunde1.strasse[j] = '\0';
    
    		printf("\n\n");
    		printf("Nummer: %d\n", kunde1.nummer);
    		printf("Name: %s\n", kunde1.name);
    		printf("Ort: %s\n", kunde1.ort);
    		printf("PLZ: %s\n", kunde1.plz);
    		printf("Strasse: %s\n", kunde1.strasse);
    	}
    
    	fclose (Lesen);
    }
    

    Kannst es mal hiermit versuchen. Allerdings musst du aufpassen, dass deine Daten.txt
    das richtige 'Format' hat.

    nr 1, name 1, ort 1, plz 1, strasse 1\n
    nr 2, name 2, ort 2, plz 2, strasse 2\n
    ...
    nr n, name n, ort n, plz n, strasse n\n
    

    Also als letztes Zeichen in der Datei muss ein Zeilenumbruch sein, sonst gibts ne
    Endlosschleife. So... ich hoffe das hilft dir weiter. 🙂



  • Geh mal nochmal deine zweite while-Schleife in Gedanken durch, vielleicht geht dir dann ein Licht auf ;).
    Aja, der Wert von EOF und was in help alles so drinsteht ist auch wichtig ;).



  • will bestimmt nicht wie in der erten antwort alles änder.

    Was ist denn wo falsch,und in welcher while shcleife ß



  • Brauchst du auch nicht.

    Mit der zweiten while-Schleife meine ich deine Schleife, in der du deine Daten von der Datei liest. Vergleich mal speziell die Bedingungen deiner auskommentierten while-Schleife und dieser while-Schleife ;).



  • dann sag doch was da falsch ist,ich sehe es nicht !? Hab auchs chon alle probiert mit -1 und ohne etc...



  • Gut, das was ich meinte, hast du dann ja schon gemacht (-1 ;)). Hab mir deinen Code deshalb nochmal angeschaut, weil ich eine betimmte Vermutung hatte, die sich auch bestätigt hat.

    Du hast jetzt zwei Möglichkeiten:

    - Nach der Schleife zum Einlesen nochmal prüfen, ob das Dateiende erreicht wurde und dann mit break aus der großen Schleife rausspringen oder

    - die Variable i nicht mehr ändern, um damit andere Aufgaben zu erfüllen 😉


Anmelden zum Antworten