Wie boost filesstem einsetzen



  • Hallo!

    Ich habe hier ein Frage, bei der Verwendung von boost::filesystem.

    Diese stellt ja ein Framework für den Dateizugriff dar, aber ich finde keine Klasse mit der ich ein File einlesen kann? Ich möchte ein jpg einlesen und dieses Framework verwenden...oder macht man das ganz normal mit fread?

    Also gibt es in boost::filesystem auch einen "Ersatz" für fread? Ich möchte irgendwie nicht das Framework verwenden und dann auf eine Basisfunktion wie fread zurückgreifen!

    Danke!



  • Das hat dann nix mehr mit boost::fileystem zu tun. Das einlesen kannst du mit der Standardbibliotheks Klassen machen. (std::ifstream).



  • OK, also für das einlesen eines jpg verwendet man kein boost und kein stl? danke! alles klar!



  • Doch naklar,man verwendet die stl, lies den Beitrag von drakon genau.



  • ok, wie weiß man dass etwas nicht zur stl gehört? fread gehört ja beispielsweise nicht dazu oder?



  • Alles was du HIER findest, gehört zur STL



  • Firefighter schrieb:

    Alles was du HIER findest, gehört zur STL

    Nicht wirklich. STL heisst ja Standard Template Library. Also ist das einfach der Teil der Standardbibliothek, der templates benutzt. Sprich damit sind normalerweise die Container und Funktionen gemeint. (und nicht der C-Teil, wie z.B cmath usw. ). Dazu kann man die stream Klassen auch noch zählen, da die ja auch templates sind. Allerdings ist der Begriff ja nicht definiert und somit nicht 100% klar, was damit gemeint ist.



  • drakon schrieb:

    Nicht wirklich. STL heisst ja Standard Template Library. Also ist das einfach der Teil der Standardbibliothek, der templates benutzt.

    Das wäre aber ein sehr grosser Teil. Streams und std::tr1::shared_ptr würde ich zum Beispiel nicht dazu zählen.

    Der Begriff ist zwar nicht genau definiert, aber meistens wird er im Zusammenhang mit den Containern, Algorithmen und Iteratoren verwendet. Auf der Seite wird die Standard Template Library meiner Meinung nach am ehesten durch folgende Links repräsentiert:
    http://www.cplusplus.com/reference/stl/
    http://www.cplusplus.com/reference/algorithm/
    http://www.cplusplus.com/reference/std/iterator/



  • Naja. Für mich schon. 😉

    Aber ich habe ja geschrieben, dass normalerweise Container und die Funktionen damit gemeint sind..



  • Noch eine Frage:

    Wenn ich folgenden dieses Struct definiere:

    typedef struct {
        unsigned short a;      //2Bytes
        unsigned int b;        //4Bytes
        unsigned int c;        //4Bytes
    } DATA_HEADER;
    

    Und dieses dann wie folgt befülle:

    DATA_HEADER header;
    ifstream file ("test.dat", ios::in|ios::binary);
    
    file.seekg (0, ios::beg);
    file.read ((char*) &header, sizeof(header));
    file.close();
    

    Kann ich mir dann sicher sein, dass die ersten zwei Bytes in header.a, die nächsten 4 Bytes in header.b usw liegen? Oder ist diese Methode eher unsicher?



  • Reinoslav1 schrieb:

    Kann ich mir dann sicher sein, dass die ersten zwei Bytes in header.a, die nächsten 4 Bytes in header.b usw liegen? Oder ist diese Methode eher unsicher?

    Die Ausrichtung der Member in der Klasse (Alignment) wird vom Standard nicht vorgeschrieben und kann demnach von Compiler zu Compiler variieren. Oft kannst du die Pack-Grösse aber einstellen (unter MSVC++ z.B. mit #pragma pack ). Das binäre Schreiben sollte allerdings gehen, solange das Alignment gleich ist. Aber wenn du beispielsweise als Text schreibst, bist du natürlich viel flexibler.

    Zudem ist typedef struct {} name; in C++ sehr unüblich, da eine Struktur bereits selber einen vollständigen Typ angibt. Also eher struct name {}; . Und das ist zwar ein bisschen Ansichtssache, aber ich würde die C-Casts unbedingt durch reinterpret_cast ersetzen. Meiner Meinung nach sieht man dabei schneller, was passiert, und vermeidet auch Fehler, weil man den Cast spezifiziert (C-Casts casten nämlich fast alles).


Anmelden zum Antworten