Anzeige:
Ergebnis 1 bis 10 von 10

Thema: mit fgets mehrere Zeilen einlesen

  1. #1
    Gentoo-User
    Registriert seit
    Sep 2003
    Beiträge
    249

    mit fgets mehrere Zeilen einlesen

    Hallo,
    Ich möchte mit fgets() mehrere Zeilen von der Standardeingabe einlesen.
    Wie kriege ich es hin, dass die Eingabe durch das \n nicht abgeschlossen wird, sondern so lange weitergeht, bis der Benutzer ^D betätigt?
    Danke schonmal!

  2. #2
    Milchmann Avatar von m.o.o.
    Registriert seit
    May 2003
    Beiträge
    1.192
    Meinst du in C?
    Probiers mal auf http://www.mrunix.de .
    Spontan würde mir da read einfallen (man 2 read). Mit read gehts sehr schnell, wenn du nen großen Puffer angibst.
    Wenn es das ist, was du meinst, kann ich dir auch ein Code-Beispiel geben.

    MfG

    Florian
    Sie können sich nicht auf Ihre eigene Ignorier-Liste setzen.

  3. #3
    Registrierter Benutzer
    Registriert seit
    Nov 2001
    Beiträge
    267
    Ctrl-D sendet EOF, und in dem Fall liefert fgets null zurück:
    Code:
    while(fgets(...))
        ...
    main(k){for(k=0;k<125;++k)putchar((k+1)%25? ("[k<qFUF>XB]X=9V=hm9FC"[k/6]-52)&1<<k%6?64:32:10);}

  4. #4
    Gentoo-User
    Registriert seit
    Sep 2003
    Beiträge
    249
    Danke, genau danach habe ich gesucht!
    Jetzt habe ich aber noch das Problem, dass das fgets() immer die vorherige Zeile überschreibt, ich möchte aber mehrere Zeilen in einen string einlesen und ihn danach ausgeben.

    Hier ist der Code, an dem ich das probiert habe:

    Code:
    #include <stdio.h>
    
    int main ()
    
    {
    	char eingabe[100];
    	
    	while(fgets(eingabe,sizeof(eingabe),stdin));
    		
    	printf ("%s",eingabe);
    		
    	return 0;
    }
    Ach ja, ich hätte vielleicht im Eröffnungspost schreiben sollen, dass es sich um C handelt.

  5. #5
    Registrierter Benutzer
    Registriert seit
    Nov 2001
    Beiträge
    267
    Code:
        char gesamt[ ... ]
        char eingabe[100];
        while(fgets(eingabe,sizeof(eingabe),stdin))
            strcat(gesamt, eingabe);
    Da sollte noch ein Test rein, ob 'gesamt' groß genug ist.
    main(k){for(k=0;k<125;++k)putchar((k+1)%25? ("[k<qFUF>XB]X=9V=hm9FC"[k/6]-52)&1<<k%6?64:32:10);}

  6. #6
    Gentoo-User
    Registriert seit
    Sep 2003
    Beiträge
    249
    Mein Programm sieht jetzt folgendermaßen aus:
    Code:
    #include <stdio.h>
    #include <string.h>
    
    int main (void)
    
    {
    	char gesamt[100], eingabe[100];
    	int c;
    	
        while(fgets(eingabe,sizeof(eingabe),stdin))
    	{
    		if (strlen(gesamt)+strlen(eingabe)>100)
    			break;
    		else
    			strcat(gesamt, eingabe);
    	}
    	
    	for (c=4;gesamt[c];c++)
    			printf ("%c",gesamt[c]);
    	
    	return 0;
    }
    Der Grund, warum ich die Zeichen einzeln ausgebe und erst ab dem fünften Zeichen anfange, ist der, dass mein Programm mir bei der Ausgabe des Gesamtstrings immer einige merkwürdige Zeichen vor die tatsächlich eingegebene Zeichenkette gehängt hat.
    Hat jemand eine Ahnung, was da vor sich geht?

  7. #7
    Agent (Clone #17264) Avatar von Jasper
    Registriert seit
    Jul 2002
    Ort
    The Matrix (Reloaded)
    Beiträge
    3.073
    Original geschrieben von Thaomir
    Hat jemand eine Ahnung, was da vor sich geht?
    gesamt ist nicht initialisiert. da stehen irgendwelche daten drin.
    dein problem lässt sich aber recht kurz und einfach lösen:

    Code:
    #define BUF_SIZE 100
    
    int main (void) {
      char buffer[BUF_SIZE];
      char *p = buffer;
    
      while(fgets(p,BUF_SIZE-(p-buffer),stdin)) {
        p += strlen(p);
      }
    
      printf(buffer);
    }
    -j
    "Oh my God!" "Smith will suffice" (Agent Smith, Matrix)
    "The first rule of holes is: when you find yourself in one, stop digging." (PJ, Groklaw)

  8. #8
    Registrierter Benutzer
    Registriert seit
    Nov 2001
    Beiträge
    267
    Das ist natürlich schöner als meine Version (dort hätte es auch char gesamt[...] = ""; heißen müssen).

    Aber eine Anmerkung -
    Code:
    printf(buffer);
    Das ist böse, bitte immer printf("%s", buffer) oder in dem Fall auch puts().
    main(k){for(k=0;k<125;++k)putchar((k+1)%25? ("[k<qFUF>XB]X=9V=hm9FC"[k/6]-52)&1<<k%6?64:32:10);}

  9. #9
    Agent (Clone #17264) Avatar von Jasper
    Registriert seit
    Jul 2002
    Ort
    The Matrix (Reloaded)
    Beiträge
    3.073
    Original geschrieben von denis
    Das ist böse, bitte immer printf("%s", buffer) oder in dem Fall auch puts().
    das printf() ist nur eine testausgabe, nicht sicherheitsrelevant. in "echtem" code sollte man das tunlichst vermeiden, da hast du recht. aber nun musst du auch erklären, warum das böse ist.


    -j
    "Oh my God!" "Smith will suffice" (Agent Smith, Matrix)
    "The first rule of holes is: when you find yourself in one, stop digging." (PJ, Groklaw)

  10. #10
    Registrierter Benutzer
    Registriert seit
    Nov 2001
    Beiträge
    267
    Weil das Programm bei Eingabe von '%s' o.ä. (im Idealfall) abstürzt. Sowas will man ja nicht.

    Aber klar, ist in so einem Beispiel latte. Hätt ja sein können, dass Du, oder jemand anderes, dass wirklich mal so macht. Darum der Hinweis.
    Geändert von denis (14.03.04 um 01:44 Uhr)
    main(k){for(k=0;k<125;++k)putchar((k+1)%25? ("[k<qFUF>XB]X=9V=hm9FC"[k/6]-52)&1<<k%6?64:32:10);}

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •