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:- Dateigröße ermitteln.
- Puffer bereit stellen.
- 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();
-
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! }