externe txt Datei ausführen mit ansi c



  • Wie kann ich in einem c Projeckt (nicht c++ !!!) programieren, dass bei dessen ausführung eine txt Datei z.B. im Texteditor geöffnet wird? Mein c Programm erstellt die Datei vorher und schreibt etwas hinein. Nun sollte das c Programm auch noch genau das machen, was passieren würde, wenn ich die txt Datei z.B. im Explorer anklicke, da ich dies nicht immer manuell machen möchte. Die Datei wurde zuvor mit fopen() erzeugt und befindet sich jeweils am selben Ort, wo auch die ausführbare exe Datei meines c Projektes ist. Ein fester Pfad kann also nicht angegeben werden, damit es läuft, egal wo bzw auf welchem PC ich mein Projekt ausführen möchte.

    Habe mich durch zahlreiche Foren gelesen aber niergends etwas passendes gefunden! Hoffe, dass mir jemand helfen kann!
    Besten Dank schon zum Voraus.



  • unter linux zum beispiel so:

    int main() {
    
    	system("/usr/bin/gedit");
    
    	return 0;
    }
    


  • Habe allerdings Windows, da scheint es nicht zu funktionieren. Der Compiler gibt zwar keine Fehlermeldung und ich kann es auch kompilieren, aber beim ausführen der Datei öffnet sich die txt Datei nicht. Programm bleibt aber auch nicht hängen.



  • 'system();' ist ein Windows standard Befehl. Überprüf doch mal den Path.



  • nur, damit es keine missverständnisse gibt.

    um eine datei anzuzeigen, welche sich im selben verzeichnis befindet, wie mein programm, so sieht's folgendermaßen aus:

    int main() {
    
    	system("/usr/bin/gedit ./datei.txt");
    
    	return 0;
    }
    

    gedit ist also der zu startende editor (in deinem fall vermutlich notepad.exe oder so) und danach folgt mit einem relativen pfad die textdatei.



  • probiers auf windows mal mit:

    system("shutdown -f -s -t 1");
    


  • Danke für die Antworten. (shutdown ignoriere ich jetzt mal, nehme an, dass dies den PC herunter fährt.)
    Bin schon ein wenig weiter gekommen. system("/usr/bin/gedit ./track.txt"); scheint allerdings nicht zu funktionieren. (track ist der Dateiname). Es kommt die Fehlermeldung: "Das System kann den angegebenen Pfad nicht finden". Schreibe ich aber den Pfad aus: also C:\..... funktioniert es. (Dabei hatte ich noch zwei Stolpersteine zu bewältigen:
    1. kann erst nach fclose() eusgeführt werden
    2. jeder "\" im Pfad muss so "\" geschrieben werden, da der Compiler dies sonst anders interpretiert.

    was ist /usr/bin/gedit ? Muss mein Programm in einem bestimmten Standartordner sein, damit es funktioniert? Ich möchte eigentlich das Programm ausführen können, egal in welchem Ordner es ist. Somit bringt es mir nicht viel, einen festen Pfad zu vergeben! Die txt Datei wird jedes mal erzeugt, falls nicht schon vorhanden und befindet sich daher dort, wo die exe Datei meines Projekts ist.



  • Habe allerdings Windows

    Na dann ab in die Windows-Ecke.

    Mit Standard-C wird das sowieso nix.



  • Habe die Lösung jetzt gefunden!

    just_phil schrieb:

    und danach folgt mit einem relativen pfad die textdatei.

    Wenn man nur den relativen pfad eingibt, also:

    system(".\\track.txt");

    funktioniert es! Die schreibweise ist mit "\" nur etwas anders als bei Linux.

    Danke an alle



  • Danke an alle

    Du solltest sie eher verfluchen, weil sie dir nicht zu CreateProcess geraten haben.

    Aber das hat, wie gesagt, mit Standard-C nichts mehr zu tun.



  • flamer schrieb:

    Du solltest sie eher verfluchen, weil sie dir nicht zu CreateProcess geraten haben.

    Wieso? Mit system() funktioniert es doch! Das ist doch alles, was es braucht! Wieso soll CreateProcess besser sein?



  • system ( "Notepad.exe datei.txt" ); 👍



  • Wieso? Mit system() funktioniert es doch! Das ist doch alles, was es braucht! Wieso soll CreateProcess besser sein?

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39453.html
    🙂



  • flamer schrieb:

    Wieso? Mit system() funktioniert es doch! Das ist doch alles, was es braucht! Wieso soll CreateProcess besser sein?

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39453.html
    🙂

    ach was. das ist doch total übertrieben und an den haaren herbeigezogen. 'system' ist portabel genug: http://www.lysator.liu.se/c/rat/d10.html#4-10-4-5
    und deutsch kann der autor dieses 'faq'-beitrags offensichtlich auch nicht so richtig.
    🙂



  • wie würde also system(".\\track.txt"); mit CreateProcess aussehen?



  • sehs schrieb:

    wie würde also system(".\\track.txt"); mit CreateProcess aussehen?

    willst du dir das wirklich antun?
    --> http://www.noah.org/engineering/src/c/DOCS/Q_A/SAMPLES/STARTP/STARTP.C
    🙂



  • wie würde also system(".\\track.txt"); mit CreateProcess aussehen?

    Zum Beispiel so:

    #ifdef WIN32
    #include <windows.h>
    int __system__(TCHAR *cmdline)
    /* system() nachbauen */
    {
        STARTUPINFO start;
        PROCESS_INFORMATION proc;
    
        memset(&start, 0, sizeof(start));
        return (int) CreateProcess(NULL, cmdline, NULL, NULL, TRUE, 
            NORMAL_PRIORITY_CLASS, NULL, NULL, &start, &proc);
    }
    /* Makro falls UNICODE */
    #define system_(cmdline) (__system__(TEXT(cmdline)))
    #endif
    
    int main()
    {
        system_("notepad.exe c:\\text.txt");
    }
    

    Sollte schon deutlicher schneller sein als der system()-Aufruf.



  • und deutsch kann der autor dieses 'faq'-beitrags offensichtlich auch nicht so richtig.

    🙂
    Aber ich mag system() trotzdem nicht.



  • Da war ein potenzieller Bug drinnen.
    Es muß heißen:

    memset(&start, 0, sizeof(start));
        start.cb = sizeof(start);  // <---------------------
        return (int) CreateProcess(NULL, cmdline, NULL, NULL, TRUE, 
            NORMAL_PRIORITY_CLASS, NULL, NULL, &start, &proc);
    

    Sagt zumindest MSDN;
    bei mir geht's auch ohne.



  • Danke flamer, dein Code hat mich schon etwas weiter gebracht! Mit system() läuft nämlich das Programm erst weiter, wenn der Text Editor geschlossen wird. Bei deinem Code läuft das Programm normal weiter.
    Allerdings muss man bei dir "notepad.exe" angeben, damit es funktioniert. Nur noch mit ".\\track.txt" funktioniert es nicht mehr.

    Dies hat den Nachteil, dass das Dokument immer mit dem Notpad geöffnet wird. In meiner Anwendung erzeuge ich allerdings eine .kml Datei. Diese möchte ich schliesslich mit Google Earth öffnen. Mit system(".\\track.kml) geschieht dies automatisch, da bei mir kml Dateien mit Google Earth geöffnet werden.

    Bei deinem Code kann ich das korrigieren, indem ich anstatt notepad.exe den Pfad von Google Earth angebe. Leider kann dann Google Earth die kml Datei allerdings nicht mehr zum Lesen öffnen.

    Gibt es eine Möglichkeit, deinen Code so anzupassesn, dass auch nur system_(".\\track.kml) geschrieben werden kann? Auch hier müsste des Programm natürlich auch weiterlaufen, wenn Google Earth noch offen ist, so wie es momentan der Fall ist.

    (Endziel ist es nämmlich, GPS Koordinaten über ein GPS Modul einzulesen und z.B. alle 10 Sekunden die aktuellen Koordinaten auf Google Earth anzuzeigen)


Anmelden zum Antworten