Fopen w+ läuft nicht

Liebe und eifrige Helfer

Ich programmiere kleine Konsolenprogramme in C. Nun möchte ich ein Programm schreiben, mit dem man eine Datei öffnen kann, ohne den Dateipfad mühsam eingeben zu müssen.
Ein Kollege von mir hat entdeckt, dass der Dateipfad einer Datei, die per drag&drop auf das Programm gezogen wird in argv[1] gespeichert wird (Windows).
Dies klappt: Die Datei kann geöffnet und mit printf angezeigt werden (falls txt etc.)
Dies klappt nicht: Mit fopen und w+ eine neue Datei kreieren und den Inhalt dort hineinkopieren: Die neue Datei wird nicht erstellt, trotz w+ !

Was ist hier faul?

Kann mir jemand eine Methode angeben, den Bug zu umgehen?

Danke
Kalsan

Hi,

Dies klappt nicht: Mit fopen und w+ eine neue Datei kreieren
und den Inhalt dort hineinkopieren: Die neue Datei wird nicht
erstellt, trotz w+ !

wieso „w+“? „w“ oder „wb“ alleine sollte auch schon reichen.

Stell doch mal dein „Programm“ hier hinein, damit man sehen kann, was sonst noch „faul“ sein könnte.

Gruss
norsemanna

Hallo Kalsan,

Ein Kollege von mir hat entdeckt, dass der Dateipfad einer
Datei, die per drag&drop auf das Programm gezogen wird in
argv[1] gespeichert wird (Windows).
Dies klappt: Die Datei kann geöffnet und mit printf angezeigt
werden (falls txt etc.)

Hört sich gut an, nur: wie weiss mein Proggy dann, dass es dort nachsehen soll?

lG
Martin B

Hallo Kalsan,

Hört sich gut an, nur: wie weiss mein Proggy dann, dass es
dort nachsehen soll?

lG
Martin B

Hallo Martin

Leider muss ich dich enttäuschen: das Programm weiss gar nichts, nur du. Da du der Programmateur bist, musst du der Kiste sagen, dass sie da nachschauen soll…

Gruss
Kalsan

Hallo Norsemanna

Komischerweise wird nicht mal „Fehler beim Oeffnen der Zieldatei. Zeige Quelldatei nur an.\n\n“ angezeigt, d.h. die Zieldatei meldete nicht NULL !!!

Die Anzeige der Quelldatei klappt dagegen und das Programm stürzt nicht ab.

Bitte sehr, der Quellcode:

#include 
#include 

//Dieses Programm soll eine Textdatei von fQuelle nach fZiel kopieren.


int main(int argc, char \*argv[])
{
 FILE \*fQuelle, \*fZiel;
 char fileTemp[500];
 if(argv[1]==NULL){printf("Sie muessen eine Textdatei (.txt) per Drag&Drop auf das Programm ziehen.\n"); system("pause"); exit(EXIT\_SUCCESS);}

 fQuelle=fopen(argv[1],"r");
 fZiel=fopen("Ziel.txt","w+");
 if(fZiel==NULL){printf("Fehler beim Oeffnen der Zieldatei. Zeige Quelldatei nur an.\n\n");}
 if(fQuelle!=NULL)
 {
 while(fgets(fileTemp,500,fQuelle)!=NULL)
 {
 printf("%s",fileTemp);
 if(fZiel!=NULL){fprintf(fZiel,"%s",fileTemp);}
 }
 }
 if(fZiel!=NULL){fclose(fZiel);}
 fclose(fQuelle);
 printf("\n\n");
 system("PAUSE"); 
 return 0;
}

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Liebe und eifrige Helfer

Ich programmiere kleine Konsolenprogramme in C.
[…]
Dies klappt nicht: Mit fopen und w+ eine neue Datei kreieren
und den Inhalt dort hineinkopieren: Die neue Datei wird nicht
erstellt, trotz w+ !

Was ist hier faul?

Versuch mal bei Zieldatei einen Pfad anzugeben. Das hat bei mir geholfen.

Gruß Yelmalio

Das war’s!!!

Danke vielmals, jetzt klappt’s!

*4u

Vielen Dank!
Kalsan

Sehr interessante Rätsellösung…
Ich hab nach deiner Antwort so eine Ahnung bekommen und nach der kopierten Datei auf dem gesamten Computer gesucht. Erfolgreich! Die Datei tauchte, oh Wunder, im Ordner „C:\Dokumente und Einstellungen\Administrator“ auf - zusammen mit allen anderen Dateien, die ich schon scheinbar erfolglos kopieren wollte.

Nochmals Danke
Kalsan

Hallo!

Ich hab nach deiner Antwort so eine Ahnung bekommen und nach
der kopierten Datei auf dem gesamten Computer gesucht.
Erfolgreich! Die Datei tauchte, oh Wunder, im Ordner
„C:\Dokumente und Einstellungen\Administrator“ auf - zusammen
mit allen anderen Dateien, die ich schon scheinbar erfolglos
kopieren wollte.

Tja, das hätte aber klar sein müssen. Wunder sind da nicht am Werk. Wenn kein Pfad explizit angegeben wird, landet alles im sog. „aktuellen“ Pfad, und das ist immer das Heimatverzeichnis des Users, wenn nicht anderes eingestellt.

Gruß, Jan

Wenn kein Pfad explizit angegeben wird, landet alles im
sog. „aktuellen“ Pfad, und das ist immer das Heimatverzeichnis
des Users, wenn nicht anderes eingestellt.

Eigentlich klappt das ganz gut mit dem aktuellen Verzeichnis. Aber diese Geschichte lehrt uns, immer mit Dateipfaden zu arbeiten, aha!

Wunder sind da nicht am Werk.

Kommt ganz draufan, wie man’s auslegt: Ein Wunder ist eine Gabe von Gott in Form einer guten Handlung (oder so ähnlich), ein Computer eine Welt für sich und deren Gott ist der Prozessor. Da der mitgespielt hat, hatte Computer-Gott seine Hände im Spiel, folglich handelt es sich um ein PC-Wunder :smile:) CQFD!

Naja, Ansichtssache :wink:

Gruß, Jan

Gruss Kalsan

Hallo!

Eigentlich klappt das ganz gut mit dem aktuellen Verzeichnis.
Aber diese Geschichte lehrt uns, immer mit Dateipfaden zu
arbeiten, aha!

Wenn ich eine Anwendung schreibe, die hauptsächlich in einem bestimmten Ordner mit Dateien arbeitet, setzte ich gleich am Anfang einmal diesen Ordner mit SetCurrentDirectory() und danach brauche ich mir nie mehr Gedanken um absolute Pfade machen. Das hat sich sehr bewährt.

Gruß, Jan

Wenn ich eine Anwendung schreibe, die hauptsächlich in einem
bestimmten Ordner mit Dateien arbeitet, setzte ich gleich am
Anfang einmal diesen Ordner mit SetCurrentDirectory() und
danach brauche ich mir nie mehr Gedanken um absolute Pfade
machen. Das hat sich sehr bewährt.

Tönt sehr gut! In welchem Header befindet sich die Funktion? dir.h und windows.h sinds jedenfalls nicht.

Gruß, Jan

Gruss Kalsan

Hallo!

Tönt sehr gut! In welchem Header befindet sich die Funktion?
dir.h und windows.h sinds jedenfalls nicht.

winbase.h laut MSDN. Die Headerdatei sollte aber schon von windows.h inkludiert worden sein.
Als Alternative gäbe es noch _chdir() (direct.h).

Gruß, Jan

1 Like

winbase, buggt, in windows.h ist alles unauffindbar.
Aber chdir(„Pfad“); klappt.

Vielen Dank für deine Hilfe! *4u

Kalsan

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]