Zum Forum springen
Benachrichtigungen
Alles löschen

[Geschlossen] c++ Datei einlesen und Daten weiterverarbeiten

10 Beiträge
5 Benutzer
0 Reactions
1,698 Ansichten
weberchris
Beigetreten: 17.09.2008
PokerStrategist

Hallo,
ich komm mit einem Teil dieser Aufgabe nicht ganz klar...

Aufgabenstellung ist folgende:
In einer Datei "mess.dat" sind Messwerte unbekannter Anzahl enthalten. Die Datei enthält lediglich Daten vom Typ float. Schreiben Sie ein Programm, das die Daten in den Arbeitsspeicher einliest und anschließend den größten Wert vermittelt.

-> Daten werden als 4 byte float aus binärer Datei eingelsen
-> Es wird ein eindimensionales float - Feld angelegt. Die Größe muss der Anzahl der Werte in der Datei entsprechen
.
.
.
Den Teil mit dem float Feld unbekannter Größe und das zwischenspeichern der Daten im Arbeitsspeicher versteh ich leider so garnicht.

Das einlesen der Daten geht ja folgendermaßen(ich hoffe ich bin da nicht auf dem Holzweg):

fstream file;
file.open("mess.dat",ios::in);

float x;

while(!file.eof()){
file >> x;

? Wie krieg ich ab hier die Daten in ein Feld gespeichert?

Danke für eure Hilfe =)


9 Antworten

Der c++ Weg wäre hier einen std::vector zu nehmen. Das ist hier aber wohl nicht gewollt. Ich denke du sollst dir zu nutze machen, dass in der Datei wirklich nur 4 byte große floats sind. Du musst also die Größe der Datei in Byte auslesen und durch 4 Teilen. dann hast du die Anzahl der Elemente. Damit kannst du dann einen Array aufm Heap der entsprechenden Größe erstellen und die Werte darin ablegen.

Die Aufgabe ist natürlich rein akademisch und total dämlich. Erstens würde man da wohl fast immer einen vector nehmen was weniger fehleranfällig ist. zweitens muss man die Werte überhaupt nicht zwischenspeichern um das Maximum zu bestimmen. Aber egal :)


JimmyPoke
Beigetreten: 26.03.2007
Oldschool Grinder

jo, einfach 4byte-weise die datei lesen und den neuen wert mit dem alten maximum vergleichen


Original von JimmyPoke
jo, einfach 4byte-weise die datei lesen und den neuen wert mit dem alten maximum vergleichen

was offenbar nicht der Aufgabenbeschreibung entspricht.


1. file.open("mess.dat",ios::in | ios::bin); für binäre Dateien

2. Du kannst mit file.seekg und file.tellg die größe der datei ermitteln und dir dann unter der voraussetzung, dass es nur floats sind schon ein dynamisches array der nötigen größe erzeugen. hier gibts dazu sogar schon ein beispiel (nur beachten, dass char 1 byte groß ist und du deshalb noch was ändern musst).

3. binäre daten sollte man mit file.read einlesen. der >> operator kann hier zwar auch funktionieren, aber braucht halt zusätzlich ne schleife.


JimmyPoke
Beigetreten: 26.03.2007
Oldschool Grinder

Original von Lifeisabug

Original von JimmyPoke
jo, einfach 4byte-weise die datei lesen und den neuen wert mit dem alten maximum vergleichen

was offenbar nicht der Aufgabenbeschreibung entspricht.

jaja is ja gut, habs nicht genau genug gelesen und viel zu pragmatisch gedacht ;)


sarc
Beigetreten: 06.06.2008
PokerStrategist

Mit read kannst dann auch direkt die komplette Datei auf einmal einlesen. Bin mir zwar sicher, dass Koenigswurst auch genau das gemeint hat, wollt aber nur noch mal explizit drauf hinweisen.

An der Stelle würde es sicher Sinn machen, warum du die dann auch wirklich korrekt im Array stehen hast.

@Lifeisabug: Ich würd in dem Fall keinen Vector nehmen. Für den Vector musst jeden Float einzeln einlesen, und regelmäßig neuen Speicher anfordern. Dazu kommt noch viel hübscher STL-Overhead (aka die Klassen sind zwar extrem flexibel aber auch arschlangsam). Das ist extrem viel langsamer als einmal die Dateigröße ermitteln, Speicher anfordern und alles auf einen Rutsch einlesen.
Fehleranfällig ist das in meinen Augen auch nicht. Wenn die Datei korrupt ist, merk ich das an der Größe. Bei der Vector-Variante würde zwar was eingelesen, wenn die Datei aber eh hinüber ist, kann ich mich auf die Werte auch nicht verlassen.


Original von sarc

@Lifeisabug: Ich würd in dem Fall keinen Vector nehmen. Für den Vector musst jeden Float einzeln einlesen, und regelmäßig neuen Speicher anfordern. Dazu kommt noch viel hübscher STL-Overhead (aka die Klassen sind zwar extrem flexibel aber auch arschlangsam). Das ist extrem viel langsamer als einmal die Dateigröße ermitteln, Speicher anfordern und alles auf einen Rutsch einlesen.
Fehleranfällig ist das in meinen Augen auch nicht. Wenn die Datei korrupt ist, merk ich das an der Größe. Bei der Vector-Variante würde zwar was eingelesen, wenn die Datei aber eh hinüber ist, kann ich mich auf die Werte auch nicht verlassen.

Du hast recht, read + array ist hier sicherlich die eleganteste Variante. Habe auch nicht behauptet, dass ich diese Aufgabe mit einem vector lösen würde. Der Rest den du schreibst ist schlichtweg falsch.
Die grundlegenden Operation stl vector vs dynamic array sind auf Assemblerebene identisch (index,increment, deref). Beim anlegen bin ich nicht sicher aber ist vernachlässigbar da man es eh nur einmal macht, wenn man bedenkt was man dadurch gewinnt.
Der Speicherunterschied ist ebenfalls lächerlich sofern es die Applikation nicht erfordert. Aber dann darf ich gar kein c++ mit Klassen programmieren. Und wenn es dir dennoch stinkt benutze einfach boost::array.


sarc
Beigetreten: 06.06.2008
PokerStrategist

Ja, die grundlegenden Aktionen sind gleich. Aber wenn der Vector mal vollgelaufen ist muss er erweitert werden, und das dauert. Und du wirst mir sicher auch zustimmen, dass ne Schleife, in der ich nacheinander Element für Element hinzufüge, langsamer ist als alles in einem Rutsch einzulesen.


weberchris Themenstarter
weberchris
Beigetreten: 17.09.2008
PokerStrategist

Danke Leute, das hat mir weitergeholfen :)


Teilen: