Eigenes Programm in stdin schreiben und gleich wieder daraus lesen



  • Hallo,

    ich habe mal eine Frage, warum geht das nicht so:

    fprintf(stdin, "a\n");
    	fgets(test, 2, stdin);
    

    Ich möchte in die stdin schreiben, und das dann sofort wieder auslessen.
    Irgendwie wird die fprintf anweisung ignoriert.

    (Bitte jetzt nicht nach den Sinn des Progs fragen^^)



  • Du musst zuerst von der Standardeingabe lesen und dann in die Standardausgabe "schreiben".

    fgets(test, 2, stdin); 
    fprintf(stdout,"%s",test);
    


  • probier's mal mit 'ungetc'. das geht zwar oft nur mit einem zeichen, aber vielleicht hast du ja glück und bei dir sind's mehr.
    🙂



  • Hello,

    ich möchte nicht ausgeben was der Benutzer schreibt....

    Ich möchte eigentlich die Funktion kbhit(); für Linux nachprogrammieren.
    Eine Funktion die auf eine Tastatureingabe wartet habe ich schon, allerdings wie ich an die Eingabe selbst rannkomme ist mir noch schleierhaft.



  • Ich komm leider nicht weiter, auch nicht ungetc...
    jetzt wird nicht mehr aufs Enter gewartet, aber es wird nur das Enter gebuffert..

    Ich möchte eigentlich die Funktion kbhit(); für Linux in Ansi C nachprogrammieren, aber ganz bekomm ichs nicht hin.

    Hier mal was ich habe:

    #include <unistd.h>
    #include <errno.h>
    #include <sys/types.h>
    #include <sys/time.h>
    #include <termios.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    static int io_tio_set_flag_c_lflag(int fd, int val, int on, int *old) 
    { 
    	struct termios tio; 
    	if (tcgetattr(fd,&tio)) return -1; 
    	if (old) *old=(tio.c_lflag & (val)); 
    	if (on) tio.c_lflag |= (val); 
    	else tio.c_lflag &= ~(val); 
    	if (tcsetattr(fd,1,&tio)) return -1; 
    	return 0; 
    } 
    
    static int 
    io_charavail(int fd)
    {
    	fd_set set;
    	struct timeval zeit;
    	int ret;
    	int tty=1;	
    	int old_ICANON;
    	FD_ZERO(&set);
    	FD_SET(fd,&set);
    	zeit.tv_sec  = 0;
    	zeit.tv_usec = 0;
    	if (-1==io_tio_set_flag_c_lflag(fd,ICANON,0,&old_ICANON)) {
    		if (errno==EINVAL || errno==ENOTTY) 
    			tty=0;
    		else {
    			fprintf(stderr, "ICANON");
    			return -1;
    		}
    	}
    
    	while (1) {
    		ret=select(fd+1,&set,0,0,&zeit);
    		if (ret>=0) break;
    		if (errno==EINTR) continue;
    		fprintf(stderr, "select");
    		break;
    	}
    	if (tty)	
    		io_tio_set_flag_c_lflag(fd,ICANON,old_ICANON,NULL);
    	return ret;
    }
    
    int main(void)
    {
    	char test[5];
    	int r;
    
    	while ((r=io_charavail(0))==0); // Wartet solange, bis was eingegeben wird
    
    	ungetc(10, stdin);
    
    	fgets(test, 5, stdin);
    
    	printf("Der Buchstabe ist: --> %s <--\n",test);
    
    	return 0;
    }
    


  • Kann es sein das ungetc() den Tastaturbuffer loescht?



  • Glaub jetzt hab ich den Fehler,
    ungetc() gibt die chars immer vorne hinzu, ich möchte aber ein /n hinten anhängen.

    gibts eine funktion die einen char hinten in den buffer schreibt?



  • <string.h> ist die bibliothek die du suchst 😉


Anmelden zum Antworten