externe txt Datei ausführen mit ansi c



  • 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)



  • Mit system(".\\track.kml) geschieht dies automatisch, da bei mir kml Dateien mit Google Earth geöffnet werden.

    Könnte daran liegen, daß das Lauf-Verzeichnis nicht stimmt,
    das kannst du mit dem 8. Parameter für CreateProcess ändern.
    Vielleicht kann das aber CreateProcess auch nicht.

    Prinzipiell könntest du auch selbst in der Registry nachschlagen,
    oder über den Process Handle aus der PROCESS_INFORMATION Struktur
    auf den Prozess zugreifen.

    Ich würde im WinAPI-Forum nachfragen.
    Oder doch system() nehmen.



  • Oder doch system() nehmen.

    Lieber nicht, alle 10 Sekunden eine Shell starten ist
    eine schlechte Sache.


Anmelden zum Antworten