Programm mit Datei als Parameter öffnen



  • Hallo,
    ich möchte einen Programm schreiben, das eine Datei einliest und damit dann halt was macht. Und zwar soll das so gehen, dass beim Programmaufruf die Datei als Parameter mitgegeben wird, also sowas wie datei.exe text.txt. Das Programm soll die Datei dann automatisch zum Lesen öffnen.

    Wie mache ich sowas?

    MfG plizz



  • Hallo,

    die Hauptfunktion main macht das.

    int main (int argc, char *argv[]) {
        ...
    }
    

    argc gibt Dir die Anzahl der Parameter inkl. des eigenen Dateinames. Bei datei.exe text.txt wird argc 2 sein. Die Parameter an sich stehen im String-Array argv . Die Parameter erhälst du dann mit argv[0] ... argv[argc-1] , wobei argv[0] der eigene Dateiname ist.

    Hoffe, man konnte helfen 🙂

    Gez. monstermunchkin

    Edit: Hier noch was zum Nachlesen.



  • Ja hilft, danke.

    Wenn ich es richtig verstanden habe, heißt das also, dass ich auf den Dateinamen jetzt immer durch argv[1] zugreifen kann ?



  • plizzz schrieb:

    Wenn ich es richtig verstanden habe, heißt das also, dass ich auf den Dateinamen jetzt immer durch argv[1] zugreifen kann ?

    Ja, genau 🙂



  • Ok, ich habe nun ein Problem. Ich habe folgenden Code geschrieben:

    int main(int argc, char** argv)
    {
    int n,m;
    FILE *datei;

    datei = fopen(argv[1], "r");

    if (datei == NULL) {
    printf("Fehler, konnte die Datei nicht oeffnen!\n");
    return 0;
    }

    fscanf(datei,"%i%i", &n, &m);
    fclose(datei);
    printf("%i Knoten, %i Kanten\n", n, m);
    return 0;
    }

    Wenn ich einfach anstatt argv[1] den Dateipfad schreibe, funktioniert es. Wenn ich es jetzt so debuggen (mit Visual C++) will, gibts erstmal nen Fehler (Kompilieren geht). Ich glaube, ich brauche da noch so einiges an Aufklärung.



  • Was genau steht denn in argv[1] ? Kann es sein, dass der Dateipfad, den du als Parameter übergibst, Leerzeichen enthält?



  • Der Dateipfad lautet:
    I:\Dokumente\Programmieren\Alte Dateien\alma1_instanz1

    Da man in C ja allerdings \ durch \\ erzeugt, habe ich
    I:\\Dokumente\\Programmieren\\Alte Dateien\\alma1_instanz1

    als Parameter übergeben.
    Aber ehrlich gesagt denke ich eher, dass ich das nicht richtig bei Visual C++ mache.
    Wenn ich dort kompiliere, gibt es keine Fehlermeldung, gehe ich allerdings auf "Starten ohne Debugging", gibt es eine Fehlermeldung und zwar nicht die, die ich da in das Programm eingebaut habe, sondern eine in Windows. Allerdings muss ich das ja machen, damit eine .exe zum Starten des Programms erzeugt wird.



  • plizzz schrieb:

    Der Dateipfad lautet:
    I:\Dokumente\Programmieren\Alte Dateien\alma1_instanz1

    Da man in C ja allerdings \ durch \\ erzeugt, habe ich
    I:\\Dokumente\\Programmieren\\Alte Dateien\\alma1_instanz1

    Der Pfad wird am Leerzeichen getrennt, d.h. man bekommt insgesamt 3 Argumente. Wenn du den Pfadnamen jedoch in Anführungszeichen setzt, funktioniert's. Was du bei der Parameterübergabe auch nicht brauchst, sind die doppel-Backslashs.

    Welche Fehlermeldung erhältst du denn?



  • Es kommt der Fehler:

    Debug Assertion Failed!

    Program: ...bla\Allgemein.exe
    File: f:\dd\vctools\crt_bld\self_x86\crt\src\fopen.c
    Line: 54

    Expression: (file!=NULL)

    ...



  • Überprüfe mal argc und argv bevor du versuchst, die Datei zu öffnen.

    If filename or mode is NULL or an empty string, these functions trigger the invalid parameter handler, as described in Parameter Validation.

    Siehe hier.



  • Also argc erkennt er. Wenn ich mir argc über printf ausgeben lasse, ist es allerdings 1. Ist ja auch klar, da ich einfach "Starten ohne Debuggen" mache und somit keine Parameter übergebe. Sache ist nur, dass ich ja die .exe brauche, um sie mit Parameter zu starten, und die wird erst so über den Compiler erstellt, was nicht funktioniert. Oder mache ich da einen Fehler und man kann die .exe schon irgendwie anders erstellen?

    Sorry, aber bekomme das irgendwie nicht gebügelt und habe auch nicht wirklich Ahnung von Visual C++. Danke dir auf jeden Fall, dass du dich so damit auseinandersetzt.



  • plizzz schrieb:

    Also argc erkennt er. Wenn ich mir argc über printf ausgeben lasse, ist es allerdings 1. Ist ja auch klar, da ich einfach "Starten ohne Debuggen" mache und somit keine Parameter übergebe.

    Da haben wir auch schon den Fehler. Das zweite Argument ist ungültig bzw. nicht vorhanden und deshalb wirft Dir VC++ eine Fehlermeldung bzgl. fopen !

    plizzz schrieb:

    Sache ist nur, dass ich ja die .exe brauche, um sie mit Parameter zu starten, und die wird erst so über den Compiler erstellt, was nicht funktioniert. Oder mache ich da einen Fehler und man kann die .exe schon irgendwie anders erstellen?

    Die .exe müsste schon erstellt worden sein. Schau mal in Deinem Projektordner nach. Da sollte ein Ordner Debug bzw. Release existieren. Falls du dort keine .exe finden kannst, guck mal in der Menüleiste unter "Erstellen" nach. Irgendwas war da mal, wenn ich mich recht erinnere.

    plizzz schrieb:

    Sorry, aber bekomme das irgendwie nicht gebügelt und habe auch nicht wirklich Ahnung von Visual C++. Danke dir auf jeden Fall, dass du dich so damit auseinandersetzt.

    Dafür sind Foren da 😉



  • Stimmt, man kann die .exe natürlich erstellen, ohne das Programm zu starten (habe ich vorher nie so gemacht, aber ist natürlich logisch). Ich habe jetzt auch den Fehler gefunden:
    Ich hatte beim Starten des Programms als Parameter immer -Parameter eingegeben, weil ich mich noch so vage erinnern konnte, dass es das damals ab und an in einem Computerspiel so gab. Aber das lag wohl daran, dass der entsprechende Parameter immer genau so hieß. Mit einem einfachen Leerzeichen geht es jetzt genau so, wie es soll. Das Problem ist also gelöst.

    Danke für deine Hilfe und Geduld!

    MfG plizzz


Anmelden zum Antworten