Problem mit Dateiverarbeitung



  • Hi,
    ich muss mich wegen der Hochschule mit der Dateiverarbeitung in C rumschlagen.
    (Da merkt man erstmal wie schön das in C++ geht)

    Ganz simpler Code

       FILE *f = fopen("file.txt","r");
    
       if (f != NULL) {
                 //Code der hier keine relevanz für das Problem hat.
       }
       else {
       	fprintf(stderr, "Dateifehler\n");
       }
    

    Das Problem ist, wenn ich das Programm über die IDE (VS 2017) aufrufe funktioniert das öffnen der Datei wunderbar, aber wenn ich das Programm über die Kommandozeile aufrufe wird die Datei, welche im selben Verzeichnis liegt wie das Programm selbst, nicht gefunden bzw. nicht geöffnet, sonder direkt in den else-Block gesprungen.

    Wie lässt sich das lösen?



  • Das ist nicht anders als in C++: entscheidend ist das working directory, nicht das Programmverzeichnis. Wenn du in das Verzeichnis, das die Datei enthält, wechselst, sollte es funktionieren.



  • Ermittel doch mit argv[0] den programpfad des ausführenden Programmes und übergebe ihn mit zu der ladenden Datei



  • @ascharan
    Das geht nicht (zumindest nicht immer). Zum Beispiel, wenn die Datei aus einem anderen Verzeichnis heraus direkt gestartet wird.
    Die einzig zuverlässige Methode ist GetModuleFileName[Ex] mit NULL bzw. mit [GetCurrentProcess()] als ersten Parameter aufzurufen (Psapi.h). Anschließend kann dann entweder der Pfad zusammengebastelt oder SetCurrentDirectory aufgerufen werden.



  • Hat bei mir bisher immer geklappt egal ob ichs via batch, Verknüpfung oder per shellexecute aus nem anderen Program gestartet hab . Hatte damit bisher eigentlich nie Probleme.

    Da ja eigentlich argv[0] immer den Pfad des gestarteten Programms beinhaltet, dachte ich zu mindest.

    🤡



  • @ascharan
    Meistens klappts ja auch, vgl. z.B. hier.
    Das gilt auch für Prozesse, die mit CreateProcess gestartet werden und der Aufrufer die Sache mit den Argumenten nicht so ernst nimmt.



  • Immer den vollen Pfad verwenden. Siehe auch: https://en.wikipedia.org/wiki/Fully_qualified_name#Filenames_and_paths



  • Danke schon mal für die Lösungsansätze. Ich werde da noch mal mit meinem Professor rücksprache halten müssen, ob es auf seinem Linux-Testsystem für das Programm reicht den Dateinamen anzugeben, sprich das sichergestellt ist das die working directory gleich dem Programmverzeichnis ist.



  • Warum nimmst du nicht den Dateinamen als Kommandozeilenparameter entgegen? Dann kann man angeben, wo sich die Datei befindet. Oder ist file.txt eine unbedingt zum Programm zugehörige Datei? Wenn sie klein genug ist, kannst du auch solche Späße machen wie sie direkt mit xxd in einen Header zu wandeln und diesen direkt zu includen...



  • @wob Die Datei hat einen bestimmten Namen, file.txt diente hier nur als Platzhalter, dieser soll auch fest im Programm verankert werden. Ist ne Vorgabe vom Prof. Sonst hätte ich das auch so gelöst das der Dateiname als Parameter übergeben wird.


Anmelden zum Antworten