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?
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?
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…
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]
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.
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.
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.
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 ) CQFD!
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.
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.