Wie kann man in C++ mit Dateien arbeiten?



  • Ich beziehe mich auf binäre Dateien die zur Laufzeit des Programms in ihrer Größe noch nicht bekannt sind. Ich hatte mal was von Dynamischer_Speicherverwaltung mittels Zeigern und mit vom new -Operator allokierten Speicher gehört.

    Möchte mir da wer helfen? (Beispiele wären nett. Z.B. mit einer .jpg Datei)

    Gruß Skully





  • Was genau willst du machen? Du schreibst JPEG Datei - was willst du denn mit der JPEG Datei anfangen? Sie als Bild laden/darstellen? Dann verwenden eine Library die JPEG Dateien laden/dekodieren/darstellen kann.



  • hustbaer schrieb:

    Was genau willst du machen? Du schreibst JPEG Datei - was willst du denn mit der JPEG Datei anfangen? Sie als Bild laden/darstellen? Dann verwenden eine Library die JPEG Dateien laden/dekodieren/darstellen kann.

    Mir gehts eigentlich nur darum, mit (binären) Dateien unterschiedlicher Größe zu arbeiten. Sie also z.B. zu verschieben, sortieren, hochladen etc.



  • Also unter dynamischer Speicherverwaltung verstehe ich das unabhängige allokieren von Speicher im Arbeitsspeicher während der Laufzeit des Programmes. Das geht mit new und delete([]). Binäre Dateien haben erstmal überhaupt nichts damit zu tun.



  • skullyan schrieb:

    Mir gehts eigentlich nur darum, mit (binären) Dateien unterschiedlicher Größe zu arbeiten. Sie also z.B. zu verschieben, sortieren, hochladen etc.

    Hi,
    das geht im Groben etwa so:

    1. Dateigröße ermitteln.
    2. Puffer bereit stellen.
    3. Daten einlesen.

    Dazu mal ein paar Codefetzen:

    ifstream in ("my_file.bin", ios::binary);
    // Achtung, bytes wird bei einer Dateigrosse > LONG_MAX negativ!
    long bytes = in.seekg ( 0, ios_base::end ).tellg();
    2)
    unsigned char* buf;
    buf = new unsigned char [bytes];
    3)
    // Dateizeiger an den Anfang der Datei zurueckholen.
    in.seekg ( 0, ios::beg );
    // Daten einlesen.
    in.read ( (char*)buf, sizeof buf * bytes );
    // Stream schliessen.
    in.close();


  • Mod

    Warum nicht einen der schönen dynamisch mitwachsenden Container aus der STL verwenden?



  • char* auf unsigned char* casten macht in dem Beispiel auch viel Sinn 🙄



  • SeppJ schrieb:

    Warum nicht einen der schönen dynamisch mitwachsenden Container aus der STL verwenden?

    Die Variante ist natürlich besser, aber der Threaderöffner wollte etwas mit new machen.

    hustbaer schrieb:

    char* auf unsigned char* casten macht in dem Beispiel auch viel Sinn 🙄

    Hier wird unsigned char* auf char* gecastet. Selbstverständlich macht das Sinn.



  • SeppJ schrieb:

    Warum nicht einen der schönen dynamisch mitwachsenden Container aus der STL verwenden?

    weil der nicht schön sondern potthässlich ist.



  • einles0r schrieb:

    hustbaer schrieb:

    char* auf unsigned char* casten macht in dem Beispiel auch viel Sinn 🙄

    Hier wird unsigned char* auf char* gecastet. Selbstverständlich macht das Sinn.

    Wenn es Sinn macht, dann kannst du diesen Sinn auch sicher erklären. Ich warte.



  • hustbaer schrieb:

    einles0r schrieb:

    hustbaer schrieb:

    char* auf unsigned char* casten macht in dem Beispiel auch viel Sinn 🙄

    Hier wird unsigned char* auf char* gecastet. Selbstverständlich macht das Sinn.

    Wenn es Sinn macht, dann kannst du diesen Sinn auch sicher erklären. Ich warte.

    #include <fstream>
    using namespace std;
    int main()
    {
    	char f;
    	unsigned char b;
    
    	ifstream a("txt.txt");;
    	a.read(&f, 1);   // OK
    	//a.read(&b, 1);	 // Fehler!
    	a.read((char*)&b, 1);	 // OK!
    }
    

    😉


Anmelden zum Antworten