in eine Datei schreiben



  • hallo allerseits,

    im folgenden Code versuchte ich in eine Datei zu schreiben und den Inhalt auszugeben leider ist es mir misslungen es werden irgendwelche bits ausgegeben, obwohl es sich um eine ASCII handelt.
    kann mir jemand sagen was da nicht stimmt?

    #include<stdio.h>
    #define FILNAM "youness.txt"
    #define BUFLEN 80
    int main()
    {
    	FILE *pfile;
    	char buf[BUFLEN];
    	pfile = fopen (FILNAM, "w");
    	if (!pfile)
    	{
    		printf("oeffnen ging schief\n");
    		return;
    	}
       	fprintf (pfile, "Erste Zeile\n");
    	fprintf (pfile, "Zweite Zeile\n");
    	fclose (pfile);
    
    	fopen (pfile, "r");
    	if (!pfile)
    	{
    		printf ("oeffnen ging schief\n");
    		return;
    	}
    	fscanf (pfile, "%s", buf);
    	printf (buf);
    	fscanf (pfile, "%s", buf);
    	printf (buf);
    	fclose (pfile);
    	return 0;
    }
    

    MFG Youness



  • myouness27 schrieb:

    fopen (pfile, "r");
    

    diese Zeile sollte eigentlich nicht kompilieren!

    Was soll der Sinn davon sein? Siehe man: fopen(3) zur Verwendung von fopen

    fscanf (pfile, "%s", buf);
    	printf (buf);
    

    Das ist auch böse

    1. kann es zu einem Bufferoverflow führen bei fscanf, da du nicht die Länge von buf angibst und er einfach Zeichen einliest
    2. Wenn du eine komplette Zeile lesen willst, dann nimm man: fgets(3)
    3. Übergebe niemals einen extern eingelesenen Buffer als ersten Parameter von printf, da printf den Buffer parst und auswertet! Schau dir zB mal man: puts(3) an oder benutze printf("%s\n", buf);



  • <Some errors corrected>

    #include<stdio.h>
    #define FILNAM "youness.txt"
    #define BUFLEN 80
    int main()
    {
        FILE *pfile;
        char buf[BUFLEN];
        pfile = fopen (FILNAM, "w");
        if (!pfile)
        {
            printf("oeffnen ging schief\n");
            return;
        }
        fprintf (pfile, "%s",  "Erste Zeile\n");
        fprintf (pfile, "%s", "Zweite Zeile\n");
        fclose (pfile);
    
        fopen (FILNAM, "r");
        if (!pfile)
        {
            printf ("oeffnen ging schief\n");
            return;
        }
    
        fgets (buf, BUFLEN, pfile);
        printf (buf);
        fgets (buf, BUFLEN, pfile);
        printf (buf);
        fclose (pfile);
        return 0;
    }
    


  • Autocorrector [active] schrieb:

    <Some errors corrected>

    Nope. Da sind noch schlimme Bugs drin und aus dem problematischen fopen ist jetzt ein NOP geworden...



  • < There were some errors >

    #include <stdio.h>
    #define FILNAM "youness.txt"
    #define BUFLEN 80
    
    int main()
    {
        FILE *pfile;
        char buf[BUFLEN];
    
        pfile = fopen (FILNAM, "w");
    
    	if (!pfile)
        {
            printf("oeffnen ging schief\n");
            return 1;
        }
    
        fprintf (pfile, "%s",  "Erste Zeile\n");
        fprintf (pfile, "%s", "Zweite Zeile\n");
        fclose (pfile);
    
        pfile = fopen (FILNAM, "r"); // bug fixed
    
        if (!pfile)
        {
            printf ("oeffnen ging schief\n");
            return 1;
        }
    
        fgets (buf, BUFLEN, pfile);
        printf (buf);
    
        fgets (buf, BUFLEN, pfile);
        printf (buf);
    
        fclose (pfile);
        return 0;
    }
    


  • #include <stdio.h>
    #define FILNAM "youness.txt"
    #define BUFLEN 80
    
    int main()
    {
        FILE *pfile;
        char buf[BUFLEN];
    
        pfile = fopen (FILNAM, "w");
    
    	if (!pfile)
        {
            printf("oeffnen ging schief\n");
            return 1;
        }
    
        fprintf (pfile, "%s",  "Erste Zeile\n");
        fprintf (pfile, "%s", "Zweite Zeile\n");
        fclose (pfile);
    
        pfile = fopen (FILNAM, "r");
    
        if (!pfile)
        {
            printf ("oeffnen ging schief\n");
            return 1;
        }
    
        fgets (buf, BUFLEN, pfile);
        puts (buf); // fixed
    
        fgets (buf, BUFLEN, pfile);
        puts (buf); // fixed
    
        fclose (pfile);
        return 0;
    }
    


  • 👍

    jetzt würde ich bei einem Fehler nur noch auf stderr und nicht auf stdout schreiben :p



  • rüdiger schrieb:

    👍

    jetzt würde ich bei einem Fehler nur noch auf stderr und nicht auf stdout schreiben :p

    warum ?



  • weil stderr für Fehlermeldungen zuständig ist. Dann kann man zB stderr in ein Log pipen oder getrennt behandeln etc.

    btw. bei Fehlern lohnt sich so wie so die Verwendung von man: perror(3), da man dann auch noch zusätzliche Infos (die aus errno) erhält)


Anmelden zum Antworten