PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Plattformunabhängig auf Dateien zugreifen.



schoppenhauer
05-08-2006, 20:46
Hallo.

Ich würde gerne irgendwie die Möglichkeit haben, Plattformunabhängig mit C++ auf Dateien zuzugreifen. Also ich müsste nur Lesezugriff benutzen können, und die Dateien dürfen auch im Arbeitsverzeichnis sein.

Geht sowas?

panzi
05-08-2006, 22:33
Hallo.

Ich würde gerne irgendwie die Möglichkeit haben, Plattformunabhängig mit C++ auf Dateien zuzugreifen. Also ich müsste nur Lesezugriff benutzen können, und die Dateien dürfen auch im Arbeitsverzeichnis sein.

Geht sowas?
Natürlich. Mit ifstream:

#include <iostream>
//...
std::ifstream f("file-path");
f >> ...
Der Pfad muss natürlich ans Betreibssystem angepasst werden. Am besten mit entsprechenden #ifdefs zur Compiletime abfragen, welches OS es ist und entsprechend eine #define mit den Dateinamen definieren.


#ifdef WIN32
#define FILE_PATH "c:\\foo\\bar"
#else
#define FILE_PATH "/foo/bar"
#endif
//...
std::ifstream f(FILE_PATH);


Bzw. FILE_PATH per Compiler-Flag setzen und im Buildsystem ermitteln was zu verwenden ist.

Joghurt
06-08-2006, 11:22
Oder Boost Filesystem (http://www.boost.org/libs/filesystem) für platformunabhängiges Pfadmanagement nutzen.

panzi
06-08-2006, 14:52
Oder Boost Filesystem (http://www.boost.org/libs/filesystem) für platformunabhängiges Pfadmanagement nutzen.
Stimmt. :)

Christoph
17-08-2006, 08:42
Warum nimmst Du nicht einfach die File-Funktionen aus der stdio (fopen, fgets, fprintf, ...)? Ist ANSI C und somit plattformunabhängig.

panzi
17-08-2006, 18:40
Warum nimmst Du nicht einfach die File-Funktionen aus der stdio (fopen, fgets, fprintf, ...)? Ist ANSI C und somit plattformunabhängig.
Weil er C++ und nicht C programmiert? iostreams sind auch plattformunabh. std. Und boost gibts auch für sehr viele Plattformen.

Joghurt
17-08-2006, 20:26
Ist ANSI C und somit plattformunabhängig.Das schon, aber Dateinnamen und Pfadtrennzeichen nicht. Was unter Linux
f = fopen("../toll", "rb"); ist, ist unter Windows
f = fopen("..\\toll", "rb");

panzi
18-08-2006, 00:23
Das schon, aber Dateinnamen und Pfadtrennzeichen nicht. Was unter Linux
f = fopen("../toll", "rb"); ist, ist unter Windows
f = fopen("..\\toll", "rb");
Das ist ein schlechtes Beispiel, denn man kann unter Windows tatsächlich auch / verwenden, und somit sind relative Pfade gleich. Bei absoluten gibt's probleme.
Wo sich Windows noch von anderen Betreibssystemen unterscheidet: Unter Windows kann ein Dateinamen nicht jedes Zeichen beinhalten. Unter Linux geht das schon. Da geht alles, auch *?/\<>:; etc. Muss nur richtig escaped sein.

barton4
25-08-2006, 19:54
Das schon, aber Dateinnamen und Pfadtrennzeichen nicht. Was unter Linux
f = fopen("../toll", "rb"); ist, ist unter Windows
f = fopen("..\\toll", "rb");

könnte man nicht mit #ifdef was zaubern

#ifdev WINDOWS
#define PRESLASH "\\\\"
#define SLASH "\\"
#endif
#ifdef UNIX_ODER_LINUX_USW......
#define PRESLASH "/"
#define SLASH "/"
#endif

naja und dann halt statt / \ so reinzuschreiben dann PRESLASH und SLASH verwenden...

weis nicht ob das klappt, habs noch net ausprobiert

Christoph
26-08-2006, 08:39
Das ist ein schlechtes Beispiel, denn man kann unter Windows tatsächlich auch / verwenden, und somit sind relative Pfade gleich.
Zur Erläuterung: die Funktion fopen() aus der msvcrt.dll is von Microsoft so implementiert, das sie auch mit vorwärts Slash funktioniert. Andere Funktionen unter Windows (z.B. die der Windows API) tun das im allgemeinen nicht.


Weil er C++ und nicht C programmiert?
Daraus folgt ja nicht, dass man diese Funktionen nicht verwenden darf. Übrigens sind die C-Funktionen fopen etc. streng objektorientiert implementiert: fopen ist der Konstruktor, fclose der Destruktor, fprintf usw. sind die Methoden des FILE Objekts.

Allerdings kenne ich in der Tat Leute, die fstream bevorzugen, weil das "richtiges C++ ist". Das ist in meinem Bekanntenkreis aber eine Minderheit; die Mehrzahl bevorzugt auch in C++ die C stdio-Funktionen, vor allem weil sie flexibler sind bzw. verträglich mit den Posix file Funktionen sind (manchmal braucht man ja auch ein flock() oder ein write() und read(), was mit ifstream nicht geht, weil man nicht an den File-Deskriptor rankommt).

locus vivendi
26-08-2006, 13:58
Übrigens sind die C-Funktionen fopen etc. streng objektorientiert implementiert:
Streng hirnrissig meiner Meinung nach.


Das ist in meinem Bekanntenkreis aber eine Minderheit; die Mehrzahl bevorzugt auch in C++ die C stdio-Funktionen, vor allem weil sie flexibler sind [...]
Das ist ja wohl der Witz des Tages. Du kannst noch nicht mal portabel selber ein Ausgabegerät in die C IO-Bibliothek einbinden.


bzw. verträglich mit den Posix file Funktionen sind (manchmal braucht man ja auch ein flock() oder ein write() und read(), was mit ifstream nicht geht, weil man nicht an den File-Deskriptor rankommt).
Das kommt schon eher hin. Aber erstens kann man dann gleich open/read/write... und Konsorten nehmen und zweitens kann man immer noch einen Streambuffer schreiben der einen Filedescriptor benutzt (oder einen bereits fertigen verwenden).

(Drittens, für Abenteuerlustige: http://www.ginac.de/~kreckel/fileno/)

Abgesehen davon vermute ich angesichts der Frage des OP das er den Zugriff auf Filedescriptoren vorerst nicht braucht.

Es soll übrigens Leute geben, die weder die Standard C, noch die Standard C++ IO-Bibliotheken benutzen.