fgets



  • Warum liest mein Programm auch Textzeilen ein, die länger als 128 Zeichen sind?

    #include <stdio.h>
    #include <malloc.h>
    
    int main(int argc, char** argv)
    {
    	FILE *pdatei;
    	char* pBuf;
    	char* string;
    
    	if(argc < 2)
    	{
    		printf("FEHLER\nProgrammaufruf mit: woerter [textdatei] | more\n");
    		return -1;
    	}
    
    	pdatei=fopen(argv[1],"rt");
    
    	if(pBuf=malloc(128))
    	{
    		while((string=fgets(pBuf,128, pdatei)))
    		{
    			printf("%s", string);
    		}
    	}
    	else
    		printf("Fehler bei Speicherreservierung!\n");
    
    	return 0;
    }
    


  • Dann wird fgets halt mehrmals aufgerufen...



  • meinst du er lest bei nur einem Aufruf der Funktion mehr als 128 Zeichen ein?



  • Da bietet sich doch strlen() an, um solche Aussagen zu verifizieren...



  • TactX schrieb:

    Da bietet sich doch strlen() an, um solche Aussagen zu verifizieren...

    ich habe momentan nichts wo ich das testen kann



  • @SG1
    Hast natürlich recht, hab das grad mit nem printf("NEW"); in der while Schleife überprüft.

    Ich muss also für diesen Fall einen extra Zeilenvorschub einbauen, da er diesen ja bei Zeichenketten < 128 automatisch durchführt.

    Danke



  • leo aka qsch schrieb:

    TactX schrieb:

    Da bietet sich doch strlen() an, um solche Aussagen zu verifizieren...

    ich habe momentan nichts wo ich das testen kann

    Ich versteh nicht was du meinst 😕

    Man kann ganz einfach statt:

    printf("%s", string);
    

    z.B. das:

    printf("%d - %s\n",strlen(string), string);
    

    schreiben, dann sieht man sofort, dass fgets() maximal Strings mit einer Länge von 127 Zeichen einliest...



  • ich dachte du meinst, warum ich es nicht getestet habe
    aber da ich auf diesem pc mom keinen compiler drauf habe(win) konnte ich das nicht



  • Richard schrieb:

    Warum liest mein Programm auch Textzeilen ein, die länger als 128 Zeichen sind?

    fgets liest Blöcke von max. 127 Zeichen und das letzte Zeichen setzt auf \0. Solgange du fgets in eine while-Schleife liest, liest fgets permanent 127-Zeichenblöcke. Du machst aber sofort printf("%s"... und die ganze Textdatei wird gelesen und ausgeben, wie sie ist. Bsp

    Das ist eine Datei a.txt

    1234567890
    
    while((string=fgets(pBuf,3, pdatei)))
            {
                printf("%s", string);
            }
    

    das erste Mal hat fgets 12, dann 34 dann 56 dann 78, 90, die Ausgabe ist trotzdem 1234567890 als hätte fgets 10 Zeichen gelesen, aber das liegt an der printf Anweisung, weil sie niemals die Zeile runtergeht.

    Mach in deinen Code

    x=0;
    while((string=fgets(pBuf,128, pdatei)))
            {
                printf("Block %d: %s\n", x++; string);
            }
    

    und wirst sehen, dass fgets doch nur 127 Zeichen liest.

    edit: benutze stdlib.h statt malloc.h, malloc ist nämlich in stdlib.h definiert



  • leo aka qsch schrieb:

    ich dachte du meinst, warum ich es nicht getestet habe

    Achso, nein ich meinte schon den OP...



  • @supertux:

    nur da hab ich doch das Problem, dass es bei Strings, die weniger als 128 Zeichen haben, noch eine extra Leerzeile eingefügt.

    Ich hab ne Definition in nem Heft:
    fgets liest aus einer Datei ab der aktuellen Position des Dateizeigers max n-1 Zeichen. Beim Einlesen des Newlinezeichens wird die Eingabe beendet. Nach dem Zeilenvorschub oder auf das n-te Byte wird eine '\0' angefügt um den String abzuschließen.

    Wenn ich das richtig verstehe müsste es doch immer beim 128 Zeichen ein '\0' einfügen und somit automatisch einen Zeilenvorschub erzeugen?



  • Richard schrieb:

    @supertux:

    nur da hab ich doch das Problem, dass es bei Strings, die weniger als 128 Zeichen haben, noch eine extra Leerzeile eingefügt.

    mein Beispiel war nur damit du siehst, dass fgets es doch richtig macht. Ja, wenn EOF oder newline auftretten, hört fgets mit dem Lesen auf, das stimmt.

    Richard schrieb:

    Wenn ich das richtig verstehe müsste es doch immer beim 128 Zeichen ein '\0' einfügen und somit automatisch einen Zeilenvorschub erzeugen?

    Nein, fgets liest nicht von deinem char-Puffer sondern von dem Datei-Puffer, den kannst du so nicht einfach schreiben. Wenn du pBuff[127]=0; setzt, dann heißt es, dass dein String maximal Länge 127 haben wird. Aber das musst du nicht tun, weil fgets es selber tut und zwar an der richtigen Stelle.



  • [tip]wenn man in c++ programmiert bitte cstdlib, cstdio und iostream includieren![/tip]

    (weiß dass das hier ANSI C ist)


Log in to reply