probleme mit stdin



  • Ich hab versucht ein kleines tool zu schreiben was wie less funktionieren soll:

    Essoll eine Datei als Argument bekommen und diese dann Seitenweis ausgeben, wenn keine Datei angegeben wird so soll von der stdin gelesen werden, also dass man dem Programm auch was zu "pipen" kann.
    Damit die Datei in Abhängikeit der Terminalgröße ausgegenen wird verwende ich die curses biblothek, und ihre befehle in einem virtuellen Fenster. Nun hab ich das Problem, dass wenn ich z.B

    ls -l | mein_pro
    

    ausführe nur noch die letzte Seite ausgegen wird, er also nicht mehr auf eine Eingabe wartet zum weiter machen...
    was mach ich falsch

    #include <stdio.h>
    #include <stdlib.h>
    #include <curses.h>
    
    int main(int argc, char **argv) {
    
    	initscr();
      	int breite=COLS;   //Fensterbreite
      	int hoehe=LINES -1;	  //Fensterhoehe (-1 wegen einer Zeile fuer Statusbalken (fuer Hilfe etc) ?)
    
    	printf("%d, %d\n",breite,hoehe);
    
    	FILE *datei; 
    	if(argc < 2)
    		datei=stdin;
    	else
    		datei  = fopen(argv[1], "r");   //datei readonly oeffnen
    	if(NULL == datei) {
    		clear();
    		refresh();
    		endwin();
    		printf("Die angegebene Datei existiert nicht\n");
    		return EXIT_FAILURE;
    	}
    
    //Ausgeben der Zeilen bis zum Fensterende mit Zeilenumbruch bei Zeilenende
    	int c;
    	int i;
    	int j;
    	char signal;
    	while(signal!='q' && c!=EOF)
    	{
    		for(j=0; j<hoehe; j++)				
    		{
    			for(i=0; i<breite; i++)    //< weil x = 0 .. breite-1
    			{
    				if((c=fgetc(datei)) != EOF)
    				{
    					move(j,i);
    					if( ((char)c) == '\n') 	//bei Zeilenumbruch auf neue Zeile springen
    						break;
    					insch(c);   //insert char
    				}
    				else break;
    			}
    		}
    		move(hoehe,0);
    		refresh();
    		printw("beliebige Taste fuer Weiter oder q zum Beenden: ");
    

    Ich denke hier muss das Problem liegen bei getch(), jedoch fällt mir nichts weiter ein...

    signal = getch();
    		clear();
    	}
    
    	refresh();
    	endwin();
    	fclose(datei);
    	return EXIT_SUCCESS;  //0
    
    }
    

    Vielen Dank für eure hilfe



  • die gepipten daten kommen per stdin in dein programm. das gibt sicher probleme, wenn du dann noch mit der tastatur die anzeige steuern willst.

    ich verschieb dich mal nach unix/linux. die haben dort mehr ahnung von curses.



  • Dieser Thread wurde von Moderator/in c.rackwitz aus dem Forum ANSI C in das Forum Linux/Unix verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • ich glaube mir war so, dass man nach initscr() die standard ein- und ausgabe funktionen nicht mehr benutzenkann / soll sondern die pendants von ncurses (zb printw, getch etc)



  • ...was aber nichts daran ändert dass Der Standardeingabekanal NICHT mehr die Tastatur ist, sondern die Datei die gelesen wird. 🙂

    Mit dem Piping wird die Standardeingabe des Programms durch die Datei _ersetzt_, nicht ergänzt oder so (Du kannst nicht von Tastatur und Datei gleichzeitig und dennoch getrennt lesen)...


Anmelden zum Antworten