Dateiinhalt auf Standardausgabe kopieren



  • Hallo!

    Ich möchte den Inhalt einer Datei mit folgendem Programm auf die Standardausgabe ausgeben, erhalte aber stets die Fehlermeldung, dass die Datei nicht auf sich selbst kopiert werden kann.
    Aufruf: copy text1.txt

    Desweiteren habe ich noch eine Frage zum Kommentar im Code: Weshalb erhalte ich da einen parse
    Error?

    Vielen Dank im voraus für Antworten!

    #include <stdio.h>
    
    int main(int argc, char* argv[])
     {
       FILE* f;
       int index = 1;
       void filecopy(FILE* , FILE* );
       char* progname = argv[0];
        if(argc == 1) { filecopy(stdin, stdout); }
        else
        {
    	  while(index < argc)
    	   if( (f = fopen(*(&argv[index]), "r")) == NULL)
    	    //fprintf(stderr, "Fehler beim Öffnen von %s", *argv); Warum parse Error?
    	    exit(1);
    	else
    	     filecopy(f, stdout);
    	     fclose(f);
    	 }
    
       return 0;
     }
    
     void filecopy(FILE* from, FILE* to)
      {
    	int c;
    	 while( (c = getc(from)) != EOF)
    	          putc(c, to);
       }
    


  • Sind in C denn lokale Funktionsdeklerationen wieder legal? Also meiner Meinung gehört "void filecopy(FILE*,FILE*)" über main hin.

    1. Denke ich wird er bei copy eher den systeminternen Befehl nehmen als dein copy. Eventuell liegt es daran 😕. Bzw. text1.txt existiert wirklich nicht ;).

    2. Benütze mal statt *argv argv[index].

    BTW: Warum fopen(*(&argv[index]), "r"))? Warum nicht einfach argv[index] ?

    MfG SideWinder



  • Du rufst mit COPY den internen DOS-Befehl auf, nicht dein Programm.

    Side: lokale Funktionsdeklarationen waren nie illegal, wie kommst du darauf?



  • Bashar schrieb:

    Side: lokale Funktionsdeklarationen waren nie illegal, wie kommst du darauf?

    Hmm, jetzt wo du es sagst...aber irgendwo habe ich offensichtlich mal gehört "keine lokalen FD bitte" und hab wohl mit der Zeit das bitte gestrichen.

    Wenns guter Stil auch noch ist dann ist das auch noch falsch. Dann muss ich umdenken.

    MfG SideWinder



  • Lokale Funktionsdefinitionen sind illegal. Dass lokale extern-Deklarationen guter Stil sind, möchte ich mal vorsichtig anzweifeln, normalerweise gehören die ja eher in Header.



  • Erst mal Danke!
    @sideWinder Ist da nicht ein Unterschied zwischen argv[index] und *(&argv[index]);
    das erste ist nur die Adresse und das zweite der Wert, oder?

    Zum Rang des * Operators hätte ich auch noch eine Frage:

    *pointer++ -> Wer hat hier Vorrang? (Sorry, kann das gerade nicht am Pc testen)

    Wird hier zuerst die Adresse erhöht und dann kommt erst der * zum Einsatz, weil von Rechts nach Links ausgewertet wird, obwohl eigentlich * Vorrang vor + hat?



  • *pointer++

    ++ hat Vorrang. Das heißt, zurückgegeben wird *pointer, und danach wird pointer inkrementiert.



  • Das verstehe ich nicht ganz:

    ++ hat zwar Vorrang, aber es wird dennoch zuerst *pointer zurückgegeben? 😕



  • @Frage
    Das ++ hat Vorang, aber das Inkrement wird erst nach der Auswertung von pointer gemacht, weil es ja postfix ist.

    Wenn ++ nicht Vorang hätte, dann würdest du den Wert, auf den pointer zeigt, erhöhen.


Anmelden zum Antworten