Bildschirmausgabe des Inhalts einer Datei



  • Bin ein C-Anfänger. Wie geht das?



  • #include <stdio.h>
    
    int main(int argc, char *argv[]) {
    
            FILE *f = fopen("tmp.txt","r");
            char c;
    
            while((c=fgetc(f)) != EOF) {
                    printf("%c", c);
            }
    
            fclose(f);
            return 0;
    }
    


  • Super. Danke!
    Versuche gerade krampfhaft mit `argv[1]` den Pfad als Parameter den Programm zu übergeben.

    ...
    FILE *f = fopen("%s", argv[1], "r");
    ...
    

    Compiler: too many arguments to function `fopen'
    Wie lautet die korrekte Syntax?



  • wieso uebergibts du ihm als ersen parameter "%s" .. ?
    das brauchst du nicht

    wennst ähnliche Fehler hast nochmal hast scho in der docu nach
    zB:
    msdn, bzw man fopen



  • FILE *f = fopen(argv[1],"r");
    

    Jupp, einfach so.



  • Harley Filben schrieb:

    Super. Danke!
    Versuche gerade krampfhaft mit `argv[1]` den Pfad als Parameter den Programm zu übergeben.

    ...
    FILE *f = fopen("%s", argv[1], "r");
    ...
    

    Compiler: too many arguments to function `fopen'
    Wie lautet die korrekte Syntax?

    fopen ist keine Elipse wie printf. In C gibt es Funktion, die eine unbekannte Anzahll von Paramter annhemne (die sog. Ellipsen (wenn ich den Namen nicht verwechselt hab)). Dazu zählen alle printf Möglichkeiten, sonst kenne weitere. Der Rest der Funktionen wie fopen sind keine Ellipsen, d.h. du kannst sowas nicht machen. In C gilt nicht dass "%s", variable durch den Wert der Variable ersetzt wird. Bei printf geht es, nur weil printf explizit %s durch den Wert der Variable ersetzt. Siehe man: fopen(3), fopen nimmt nur 2 const char*. Du solltest wirklich ein Buch über C lesen.



  • Danke bis hierher an alle.
    Nun möchte ich das Programm um eine Zeilennummerierung bei der Ausgabe auf dem Bildschirm erweitern:

    1:   #include <stdio.h>
    2:
    3:   int main()
    4:   ...
    5:   ...
    

    VIELEN DANK.



  • Soll heißen, für diesen Quelltext

    #include <stdio.h> 
    
    int main(int argc, char *argv[]) { 
    
            FILE *f = fopen(argv[1], "r"); 
            char c; 
    
            while((c=fgetc(f)) != EOF) { 
                    printf("%c", c); 
            } 
    
            fclose(f); 
            return 0; 
    }
    


  • Denk mal selber nach wie können dir nicht alles vorporggramieren
    tipp: '\n'



  • Da kann ich auch mal helfen 🤡

    #include <stdio.h> 
    
    int main(int argc, char *argv[]) { 
    
            FILE *f = fopen(argv[1], "r"); 
            char c;
            int i=1;  // Zähler deklarieren
    
            while((c=fgetc(f)) != EOF) {  
                    printf("%c", c);                
                    if(c == '\n') //Falls ein Zeilenumbruch gefunden wurde
                    {
                    printf("%d ", i); //Nummer schreiben
                    i++; //Zeilen hochzählen
                    }
            } 
            fclose(f); 
            return 0; 
    }
    


  • int main(int argc, char *argv[]) {
    
            FILE *f = fopen(argv[1], "r");
            char c;
            int i;  // Zähler deklarieren
    
            printf("0: "); // Erste Nummerierung ausgeben
    
     /* for schleife mit hochzählender Variable ersetzt die while */       
    
            for(i=1;(c=fgetc(f)) != EOF);i++) {  
    
                    printf("%c", c);                
                    if(c == '\n') //Falls ein Zeilenumbruch gefunden wurde
                    {
                    printf("%i: ", i); //Nummer schreiben
                    }
            }
            fclose(f);
            return 0;
    }
    

    Dadurch wirds en bissl kürzer ... aber ist im Prinzip des gleiche blos klein bisschen verändert

    Alternativ kannstes auch mit fgets machen, dann hastes mit der Nummerierung en bissl leichter ...



  • @Soul

    Ich denke nicht, dass das richtig ist. Denn bei deinem Beispiel wird bei jedem Buchstaben i inkrementiert. Wir wollen das aber nur bei jeder Zeile.


Anmelden zum Antworten