Weiss nicht wie ich fgets einbauen sollen



  • Hallo bin neu hier im Forum und brauche mal eure Hilfe und zwar soll ich in folgendem Code den Befehl fgets einbauen weil es schöner aussieht kann mir jemand vielleicht dabei helfen komme nicht mehr weiter ? 😞

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef unsigned char BYTE;
    typedef struct sBuch {
    	unsigned int Nr;
    	char Author[30];
    	char Titel[100];
    	unsigned long ISBN;
    } tBuch;
    
    int myatoi(char c) {
    	switch(c) {
    		case '0': return 0;
    		case '1': return 1;
    		case '2': return 2;
    		case '3': return 3;
    		case '4': return 4;
    		case '5': return 5;
    		case '6': return 6;
    		case '7': return 7;
    		case '8': return 8;
    		case '9': return 9;
    		default: -1;
    	}
    }
    
    BYTE line2struct(char* cstr, tBuch* buch) {
    	char c; 
    	int f=0,i=0,fi=0;
    	char strs[4][100];
    	char isbn[10];
    	unsigned long isbnn=0, sum = 0;
    	char* tmp = strs[0];
    
    	while((c=cstr[i++])!='\0'&&f<4)
    		if(c==';') {
    			strs[f][fi] = '\0';
    			f++;
    			fi=0;
    		} else strs[f][fi++]=c;
    	strs[f][fi] = '\0';
    
    	i=0;f=0;
    	while((c=strs[3][i++])!='\0') {
    		if(c==' ') {
    			f++;
    			continue;
    		}
    		if(c=='-') {
    			f++;
    			continue;
    		}
    		isbn[i-1-f]=c;
    		if(i-f==13&&c=='X') {
    			isbnn*=10;
    			c=10+42;
    		}
    		isbnn*=10;
    		isbnn+=myatoi(c);
    	}
    	isbnn/=10;
    
    	for(i=1;i<=9;i++)
    		sum+=myatoi(isbn[i-1])*i;
    	if(!(sum%11==myatoi(isbn[9])||(sum%11==10&&isbn[9]=='X')))
    		return sum%11;
    	//isbnn/=10;
    	// Werte in buch schreiben
    
    	// WINDOWS C BUG BEHEBEN:
    	while(myatoi(*tmp++)<0);
    	tmp--;
    
    	buch->Nr = atoi(tmp);
    	strcpy(buch->Author,strs[1]);
    	strcpy(buch->Titel,strs[2]);
    	buch->ISBN = isbnn;
    	return 0;
    }
    
    void ausgabe(tBuch *b,int zeilenanzahl) {
        int i;
        unsigned long ausI; 
        unsigned long aust; 
        int sum=0;
        char pruef;
        while(zeilenanzahl-->0) {
        ausI = b->ISBN;
        aust = b->ISBN;
    		if(b->ISBN == 0)
    
    			printf("FEHLERHAFTER DATENSATZ...\n");
    		else {
    	    	printf("-------------------------\n-> Nr %i\n-> Author %s\n-> Titel %s\n->",b->Nr,b->Author,b->Titel);
    		    for(i=9;i>0;i--) {
                     sum+=(aust%10)*i;
                     aust/=10;
                }
                sum=sum%11;
                if(sum>9)
                     pruef='X';
                else
                    pruef=sum+48;
    			printf("ISBN %lu",ausI/100000000);
    		    printf("-");
    		    ausI=ausI%100000000;
    		    printf("%lu",ausI/1000);
    		    printf("-");
    		    ausI=ausI%1000;
    			printf("%lu",ausI);
    			printf("-%c\n\n",pruef);
            }
    		b++;
    	}
    }
    int main() {
    
    	FILE* f = fopen("test.txt", "r");
    	tBuch* b=malloc(sizeof(tBuch)); // das hΣtte ich auch so gemacht wie du
    	// ein dynamisches Array vom type tBuch
    	// der lΣnge eins.
    	int zeilenanzahl=0;
    	char* zeile = malloc(sizeof(char)*100); // Ich erstelle ein dynamisches
    	// Array der gr÷▀e 100
    	int zeile_len = 0; // damit ich wei▀ wie gro▀ zeile ist;
    
    	if(f==NULL) return -1;
    
    	while(!feof(f)) {
    		while( ( zeile[zeile_len++] = fgetc(f) ) != '\n') {
                 //  zeile_len++;
    			if(feof(f)) break; /* lesen abbrechen wenn datei zu ende */
    				if((zeile_len%100)==0)
    					if( (zeile = realloc(zeile, sizeof(char)*(zeile_len+100)  )) == NULL )
    						return -1; // kein RAM mehr frei
    		}
    		zeile[--zeile_len] = '\0'; // erstetze /n mit /0
    		if(zeile_len<=1) continue; // ⁿberspringe lehre zeilen
    		zeile_len=0;
    
    		b[zeilenanzahl] = (const tBuch){0}; // unser struct auf null setzen.
    		// das ist erstens sauber,
    		// zweites fals es ausgegeben werden
    		// solte kommt kein mⁿll sondern einfach nichts
    		// und dritens kann man dann prⁿfen ob es
    		// irgendwelchen inhalt enthΣlt
    		line2struct(zeile, &b[zeilenanzahl]);
    		zeile = malloc(sizeof(char)*100);
    		b = realloc(b, sizeof(tBuch)*(++zeilenanzahl+1));
    		if(b==NULL) return -1; // kein RAM mehr frei
    	}
    	ausgabe(b, zeilenanzahl);
    
    	free(zeile);
    	free(b);
    
    	fclose(f);
    	getch();
    	return 0;
    }
    

    ich hoffe ihr könnt mir helfen , vielen Dank im voraus 😕 🙂



  • Wenn es um Schönheit geht nehm ich fgets meist schon vor den #includes .
    Hier z.B. mal Code, den ich 2009 schrieb:

    #include <stdio.h>
    
    int main(void){
      /* blabla */
    }
    

    Und der gleiche Code nach einem umfassenden Refactoring letztes Jahr:

    /*
     * fgets
     */
    
    #include <stdio.h>
    
    int main(void){
      /* blabla */
    }
    

    😉



  • Was macht denn fgets?

    Und wo passiert in dem Code etwas ähnliches?

    Das myatoi reduziert sich auf

    (c-'0')
    

    Der Rest ist mir gerade zu verworren.



  • Ok Schönheit gaben wir jetzt.

    Wie könnte man den jetzt das mit einbauen ?



  • Na irgendwie so:

    fgets(zeile, 100, f);
    

Anmelden zum Antworten