ifstream und Verzeichnisse?!
-
Hallo zusammen,
ich habe gerade ein sehr interessantes Problem entdeckt beim Öffnen von Verzeichnissen mit ifstream. Das war keine Absicht, sondern ist einem User einer meiner Plugins aufgefallen, als er aus Versehen eine Datei "counters/standard/standard" angelegt hat statt nur "counters/standard". Das folgende Beispielprogramm läuft unter Debian Sarge mit G++ 3.4 auf folgende Exception:
terminate called after throwing an instance of 'std::ios_base::failure' what(): basic_filebuf::underflow error reading the fileDer G++ 3.3 unter exakt derselben Konfiguration gibt einen leeren String aus. Beide geben keine Fehlermeldung beim Öffnen. Die Frage ist: Wie sollte sich ifstream verhalten?!
"testobjekt" ist ein leeres Verzeichnis.
EDIT: Inhalt in dem Verzeichnis ändert nichts an der Ausgabe "leerer String" unter G++ 3.3EDIT2: G++ 3.3 linkt gegen libstdc++-5.0.7 und G++ 3.4 gegen libstdc++-6.0.3, falls das hilft.
#include <iostream> #include <fstream> #include <string> using namespace std; int main() { ifstream f("testobjekt"); if (!f) { cerr << "couldn't open" << endl; return 1; } string archive_id; f >> archive_id; f.close(); cerr << archive_id << endl; }
-
Nabend,
wie sollte es sich denn verhalten? Verzeichnisse sind ja auch nur Dateien, die
du ganz normal oeffnen kannst.Ich glaube nicht, dass 'ifstream' weiss, dass es ein Verzeichnis geoeffnet hat
(als Datei).gruss
v R
-
virtuell Realisticer schrieb:
Verzeichnisse sind ja auch nur Dateien, die
du ganz normal oeffnen kannst.Kommt auf die Definition an, aber im engeren Sinne mag das stimmen. Demnach sollte er aber zumindest nicht werfen, oder?
-
LordJaxom schrieb:
virtuell Realisticer schrieb:
Verzeichnisse sind ja auch nur Dateien, die
du ganz normal oeffnen kannst.Kommt auf die Definition an, aber im engeren Sinne mag das stimmen. Demnach sollte er aber zumindest nicht werfen, oder?
Nein, das ist keine Definitionssache. In einem Unix-Dateisystem sind Geraete,
Verzeichnisse, symbolische Links oder sockets lediglich Dateien.Warum er die Exception wirft, kann ich dir allerdings nicht sagen. Vielleicht
liegt es an den Informationen, welche in dem Verzeichnis gespeichert werden. Du
kannst dir das Verzeichnis ja mal mit einem Editor anschauen.gruss
v R
-
virtuell Realisticer schrieb:
In einem Unix-Dateisystem sind Geraete,
Verzeichnisse, symbolische Links oder sockets lediglich Dateien.Das ist mir klar.
Warum er die Exception wirft, kann ich dir allerdings nicht sagen. Vielleicht
liegt es an den Informationen, welche in dem Verzeichnis gespeichert werden. Du
kannst dir das Verzeichnis ja mal mit einem Editor anschauen.Insofern ist es doch Definitionssache, weil jeder Editor mit dem ich es probiere mir sagt "das ist keine Datei, das ist ein Verzeichnis"
- wenn auch vermutlich weil dieser Fall abgefangen wird.Fakt ist eben dass dasselbe System (mit parallel installiertem 3.3 und 3.4) unterschiedliche Ergebnisse mit ifstream liefert. Werde morgen auf der Arbeit mal einen Versuch mit VC++8 starten. Interessieren würde mich halt was der Standard (wenn überhaupt) da gebietet.