fgets macht nicht weiter



  • Hallo leute,
    hier mein Code...

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define SIZE 80
    
    struct element {
    	int nr;
    	char *zk;
    } *elList[SIZE], *p;
    
    int i, j, k, counter, cLines, again = 1, found = -1;
    char line[SIZE], seek[SIZE], get;
    
    void fl(){ while(getchar() != '\n'){} }
    
    int main(){
    	while (fgets(line, SIZE, stdin) != NULL && cLines++ < SIZE) {
    
    		//speicher fuer struct
    		elList[counter] = malloc(sizeof(struct element));
    
    		//speicher fuer zk
    		elList[counter]->zk = malloc(sizeof(line));
    
    		elList[counter]->nr = cLines;
    		strcpy(elList[counter]->zk, line);
    
    		/*printf("nr: %d; zk: %s\n", elList[counter]->nr, elList[counter]->zk);*/
    		counter++;
    	}
    
    	printf("\nsortiere...\n\n");
    
    	for(i=0;i<counter-1;i++){
    		for (j=0;j<counter-1; j++) {
    			if(strcmp(elList[j]->zk, elList[j+1]->zk) > 0){
    				p = elList[j];
    				elList[j] = elList[j+1];
    				elList[j+1] = p;
    			}
    		}
    	}
    	printf("Sag was:\n");
    	fgets(seek, SIZE, stdin);
    	printf("Du sagtest \'%s\'", seek);
    

    Es soll eine Textdatei eingelesen werden und alle zeilen werden in einer dynamischen liste gespeichert.

    Mein problem ist nun, dass die letzten 3 zeilemn fehlerhaft funktionieren, soll heißen, dass ich eingeben kann was ich will und solange enter drücken kann wie ich will, aber es geht nicht weiter : (

    wenn ich in einem extra-programm folgendes mache:

    int main(){
    	printf("Sag was:\n");
    	fgets(seek, SIZE, stdin);
    	printf("Du sagtest: \'%s\'", seek);
    
    	return 0;
    }
    

    Funktioniert es reibungslos...

    mfg
    ani



  • Naja, logisch. Wenn du stdin in eine Datei umleitest, reagiert das Programm nicht mehr auf Tastatureingaben.

    Ich hätte allerdings eigentlich erwartet, dass der letzte fgets-Aufruf mit NULL zurückkommt und sich das Programm gleich beendet, weil stdins eof-Bit gesetzt ist.



  • ich dachte nachdem ich den stdin stream mit den daten der datei "geleert" habe, kann ich den wieder benutzen, mit daten über die tastatur dann eben...

    : (

    wie kann ich denn die eingaben der tastatur wieder weiterverarbeiten?

    lg
    ani



  • Systemunabhängig wird das nicht gehen. Unter Linux könnte

    freopen("/dev/tty", "r", stdin);
    

    funktionieren (ohne das jetzt getestet zu haben). Möglich, dass unter Windows entsprechend

    freopen("CON", "r", stdin);
    

    geht. Besser wäre es allerdings, die Datei getrennt von stdin zu öffnen, weil niemand ein solches Verhalten von einem Programm erwartet; den Kram in Skripten zu benutzen, wird dadurch praktisch unmöglich. Schlag fopen und fclose nach; fgets kennst du ja schon.

    Übrigens, nur so am Rande: Dir ist klar, dass du den Speicher, den du mit malloc anforderst, auch wieder freigeben musst, oder?



  • also besser die datei extra öffnen und lesen, anstatt sie über die fileumlenkung einzulesen... ich versuchs, danke

    ja ich geb die liste am ende wieder frei.

    danke

    Edit: interessant, dass in unserer aufgabe steht, dass wir über fileumlenkung die datei einlesen sollen und dann einen such-string über die tastatur eingeben sollen ^^



  • Es ist auch möglich den Suchstring als Parameter (argc, argv) bei main mitzugeben.


Anmelden zum Antworten