Kommandoparameterübergabe an fopen in C

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von s1nu, 6. März 2014 .

Schlagworte:
Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. 6. März 2014
    Zuletzt bearbeitet: 7. März 2014
    Hallo Jungs und Mädels,

    ich brauch mal bitte eure Hilfe.. also ich möchte ein Programm schreiben, dass per Kommandozeile in Linux einen Operator und 2 Files einliest.. sprich der Befehl lautet: ./WordCount File1.txt File2.txt

    Wie übergebe ich denn die beiden char *argv[] elemente, sodass ich diese direkt in fopen ("testdatei.txt", "r") verwenden kann?

    Würde ja zB.: fopen(argv[1], "r"); nehmen, aber das klappt so nicht. Bin etwas verwundert, weil ich mit printf("%s",argv[1]); den ersten Parameter ausgeben kann, also warum kann ich den String dann nicht so einsetzen xD

    Hoffe jemand versteht was ich meine und kann mir helfen. So ganz allgemein würde meine Funktion so aussehen..

    Pseudocode:
    Code:
    File *datei;
    int i, cnt = 0;
    for(i = 1; i < argc; i++){
     datei = fopen(argv[i], "r"); // so würd ich gern, klappt aber nich^^
     char c;
     while((c=fgetc(datei)) != EOF){
     cnt++;
     }
     fclose(datei);
    }
    
    
    Nur vom Gedanken her.. sollte das Programm beide dateien oder halt je nachdem wieviele dateien man angibt diese nacheinander öffnen und die Bytes oder Zeichen zählen..

    Würde mich freuen, wenn mir jemand helfen könnte, Danke schonmal
     
  2. 7. März 2014
    AW: Kommandoparameterübergabe an fopen in C

    Hi.

    Da printf dir den richtigen String ausgibt, denke ich dein Problem liegt eher in der fopen Funktion.
    fopen liefert NULL, wenn es die Datei nicht öffnen kann. Hast du die angegebene Datei auch sicher im richtigen Verzeichnis liegen, so dass dein Programm diese finden kann? Und hast du die passenden Rechte diese zu öffnen?
    Überprüf ruhig mal "if fopen(..) == NULL"

    Code:
    if(argc > 1)
    {
     if(f = fopen(argv[1], "r") == NULL)
     printf("%s konnte nicht geoeffnet werden\n", argv[1]);
     else
     printf("%s geoeffnet", argv[1]);
    }
    Das funktioniert bei mir problemlos (windows, MinGW).
     
  3. 7. März 2014
    AW: Kommandoparameterübergabe an fopen in C

    Dein Code enthält ein paar logische Fehler:
    Code:
    [COLOR="#FF0000"]File[/COLOR] *datei; [COLOR="#FF0000"]//muss heißen FILE, da müsste eigentlich der Compiler meckern[/COLOR]
    int i, [COLOR="#FF0000"]i < argc-1[/COLOR], cnt = 0; [COLOR="#FF0000"]//Was soll das für eine Variablendeklaration sein?[/COLOR]
    for(i = [COLOR="#FF0000"]0[/COLOR]; i < anz; i++){ [COLOR="#FF0000"]//argv[0] ist immer der Programmaufruf. argv[1] der erste Parameter! Zudem wurde anz nirgends definiert[/COLOR]
     datei = fopen(argv[i], "r"); // so würd ich gern, klappt aber nich^^
     char c;
     while((c=fgetc(datei)) != EOF){
     cnt++;
     }
     fclose(datei);
    }
    evtl hilft das: The GNU C Programming Tutorial

    PS: Bytes lassen sich wohl mit fseek und ftell effizienter zählen. Siehe: ftell - C++ Reference
     
  4. 7. März 2014
    AW: Kommandoparameterübergabe an fopen in C

    danke schonmal für eure rückmeldung.. julian es handelt sich dabei um pseudocode das es FILE heißt, ist mir bewusst, hab nur beim reintippen nicht aufgepasst. Zudem stellt das nur einen teil des gesamten codes dar. argc-1 ist doch praktisch, da hab ich gleich die anzahl der gegebenen parameter abzüglich des programmnamens.. wenn ich also 2 files als parameter übergebe, dann nimmt er zuerst das argv[1] liest das aus und dann das argv[2]? So zumindestens die Idee^^ aber ich merk grad, ich hab das falsch reingeschrieben.. hab das nochmal editiert^^

    kannst du mir allgemein erklären, wie man das am besten umsetzt? müsste ja gehen oder, dass ich die argumente an fopen übergebe oder halt an fseek wie auch immer, oder nich?

    @source: joa das geht so bei mir auch, nur lässt sich das argv nicht an die fopen übergeben iwie :/
     
  5. 7. März 2014
    AW: Kommandoparameterübergabe an fopen in C

    Hallo!

    Was heisst denn "es klappt nicht"? Compiler-Fehler? FILE-Pointer wird NULL?

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main (int argc, char **argv)
    {
     FILE *files[(argc - 1)];
     int i = 0;
     
     for (i = 1; i < argc; i++)
     {
     files[i] = fopen(argv[i], "r");
     
     if (files[i] == NULL)
     {
     printf("Could not open %s.\n", argv[i]);
     } else {
     printf("%s opened.\n", argv[i]);
     fclose(files[i]);
     }
     }
     
     return EXIT_SUCCESS;
    }
    Code:
    files.exe exec.bat files.c notexists.file
    exec.bat opened.
    files.c opened.
    Could not open notexists.file.
    Mfg,

    Kolazomai
     
  6. 7. März 2014
    AW: Kommandoparameterübergabe an fopen in C

    Da ich an meinem freien Freitag gearde nichts bessers zu tun hab:
    Code:
    #include <stdio.h>
    
    int main (int argc, char *argv[])
    {
     FILE *pFile;
     int nCount = 0, i;
     
     if(argc < 2)
     {
     printf("Usage: %s file1 ... fileN\n", argv[0]);
     return -1;
     }
     
     for(i = 1; i < argc; i++)
     {
     pFile = fopen(argv[i], "rb");
     if(pFile == NULL)
     {
     printf("Unable to open file \"%s\"\n", argv[i]);
     return -1;
     }
     fseek(pFile,0, SEEK_END);
     nCount += ftell(pFile);
     fclose(pFile);
     }
     printf("Read %i Bytes\n", nCount);
     return 0;
    }
    Allerdings nur unter Windows mit msvc getestet.

    //edit: nCount muss natürlich je nach Anwendung groß genug gewählt werden. Ist aber nur ein (funktionierendes) Beispiel.
     
  7. 7. März 2014
    AW: Kommandoparameterübergabe an fopen in C

    Danke an alle, so hats geklappt Hab beide Codes getestet und waren beide erfolgreich.
     
  8. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.