[C] Datei wird nicht gefunden

frager

Erfahrenes Mitglied
Hier ein kleiner Auszug aus meinem Code:
Code:
FILE *templ;
...
templ = fopen("template.html", "r");
Das fertige Programm und template.html sind beide im Verzeichniss C:\WINDOWS\system32.
Das Problem ist dass fopen die Datei template.html nicht findet und immer NULL zurückgibt.
Wenn ich das Programm so verändere:
Code:
templ = fopen("C:\\WINDOWS\\system32\\template.html", "r");
dann läuft das Programm perfekt.
Ich will mich aber auf kein bestimmtes Verzeichniss festlegen, sondern immer in dem suchen wo das Programm liegt. Nach meinem wissen sollte die erste Version auch funktioniert, tut sie aber nicht.
Kann mir jemand weiterhelfen?
 
Ein solcher Fehler könnte passieren, wenn das Programm aus einer IDE heraus gestartet wird. Die IDE kann deinem Programm ein anderes Arbeitsverzeichnis übergeben, so dass es die Datei in einem anderen Verzeichnis sucht als in dem, in dem es selber liegt.

Aber auch, wenn das Programm nicht aus einer IDE heraus gestartet wird, kann ein falsch gesetztes Arbeitsverzeichnis schuld sein. Ein Programm hat nicht zwingend das Verzeichnis, in welchem es sich befindet, auch als Arbeitsverzeichnis gesetzt. Sicherheit kannst du bekommen, wenn du in dein Programm eine Funktion einbaust, die das aktuelle Arbeitsverzeichnis feststellt und ausgibt; bei Bedarf kannst du es ändern auf das aktuelle Programmverzeichnis.

Gawayn
 
Zuletzt bearbeitet:
Genau. Verwende zum Öffnen von Dateien immer absolute Pfade. Diese bastelst du dir zusammen aus dem Pfad der Anwendung und dem relativen Pfad, den du verwenden willst. Stichwort: GetModuleFileName().

Nebenbei: Was machen denn deine Daten im Windows-Verzeichnis? :eek:
 
Das Programm wird nicht von einer IDE heraus gestartet und geht trotzdem nicht.
Ich versuchs jetzt mal wie ihr es gesagt habt, mit dem absoluten Pfad und GetModuleFileName() usw. Danke schon mal.

Zur frage vom Kachelator:
Das ist ein Programm, dass java-class-applikationen und applets ausführt und bei bedarf eine HTML-datei generiert (daher auch template.html). Alle class-dateien sind in der registry mit diesem programm verknüpft. Wenn das programm in einem anderen verzeichniss wäre könnte es ja sein dass ich dieses verzeichniss irgendwoandershin lege, dann müsste ich den pfad in der registry wieder ändern.
und das windows-verzeichnis ist immer gleich und ein standart pfad noch dazu. Ich hoffe dass es windows nicht stört wenn da jetzt 2 dateien mehr drin sind :p
 
Original geschrieben von frager
...snip...
und das windows-verzeichnis ist immer gleich ...

...snip...

Leider nicht. Es ist zwar per default "c:\\windows\\", aber das kann jeder beim Setup schon ändern. Niemals System-Pfade fest kodieren. Für das Windows-Verzeichnis benutze die Funktionen GetWindowsDirectory respective GetSystemDirectory.

Alle anderen wichtigen Windows-Ordner (Desktop, das unsägliche Meine Dateien, Programme) sind in der Registry verzeichnet. Da sind unglaubliche Unterschiede selbst zwischen verschiedenen Windows-Versionen. Geschweige denn Sprach-Versionen (Englische Version hat keinen Programme-Ordner, heisst da Program Files).
 
darum wollte ich den pfad auch nicht fest codieren (s.o). Ich hab c:\windows\system32 nur deshalb genommen, weil ich die anderen ordner immer rumkopiere und dieser bleibt gleich solange ich nicht formatiere.

P.S:
Wäre nett wenn ihr die Parameter von GetModuleFileName, GetWindowsDirectory und GetSystemDirectory erklären würdet (sind alle in windows.h oder?)

P.S2:
Mir ist gerade eingefallen dass man den Ordner in dem das Programm ist aus **argv auslesen kann, ich probiers jetzt mal damit
 
Zuletzt bearbeitet:
Diese Parameter solltest du eigentlich selber in einer Referenz nachlesen, aber der Einfachheit halber:

Code:
DWORD GetModuleFileName(
  HMODULE hModule,    // handle to module to find filename for
  LPTSTR lpFilename,  // pointer to buffer to receive module path
  DWORD nSize         // size of buffer, in characters
);

//hModule darf NULL sein. Dann wird der Pfad der Datei ermittelt,
//die den aktuellen Prozess gestartet hat.


UINT GetWindowsDirectory(
  LPTSTR lpBuffer,  // address of buffer for Windows directory
  UINT uSize        // size of directory buffer
);


UINT GetSystemDirectory(
  LPTSTR lpBuffer,  // address of buffer for system directory
  UINT uSize        // size of directory buffer
);

Gawayn
 
Ich hoffe dass es windows nicht stört wenn da jetzt 2 dateien mehr drin sind
Das Problem ist, dass, wenn es jeder tut, nachher keiner mehr weiss, was eigentlich noch gebraucht wird. Ich denke, sowas sollte in "Eigene Dateien" gespeichert werden, aber das sind nur meine 2 Cent.
 
So, habe jetzt das verzeichniss mit argv herausbekommen, hier der code:
Code:
int i;
char *path_templ = 0;
char templ[] = "template.html";
...
for(i = strlen(argv[0]); argv[0][i] != '\\\' && i >= 0; i--)
	;
path_templ = (char *)calloc(i + strlen(templ) + 1, sizeof(char));
for(; i >= 0; i--)
	path_templ[i] = argv[0][i];
strcat(path_templ, templ);
...
free(path_templ);
Das mit dem Windows verzeichnis überlege ich mir noch :)
 
Zuletzt bearbeitet:
Zurück