Zum Inhalt springen

Anzahl der Zeichen bei Speichern von double


Empfohlene Beiträge

Geschrieben

Hallo

Ich habe double Werte mit fprintf("%E",&var) in einer Datei gespeichert, und möchte beim lesen der Werte in dieser Datei nun fseek verwenden.

Dazu wüsste ich gerne, ob double Variablen bei dieser Formatierung (oder bei einer Anderen) immer mit der gleiche Anzahl von Zeichen gespeichert werden.

Geschrieben

Moin.

Ich habe double Werte mit fprintf("%E",&var) in einer Datei gespeichert, und möchte beim lesen der Werte in dieser Datei nun fseek verwenden.

Quizfrage: Warum speicherst Du mit fprintf und liest dann nicht mit fscanf ein?

Geschrieben
Dazu wüsste ich gerne, ob double Variablen bei dieser Formatierung (oder bei einer Anderen) immer mit der gleiche Anzahl von Zeichen gespeichert werden.
Bei dieser Formatierung sind negative Zahlen schon einmal ein Zeichen länger, wegen des Vorzeichens. Das könntest du beispielsweise durch "%+E" oder "% E" (mit Leerzeichen in der Mitte) umgehen.

Der C-Standard sagt, dass der Exponent mindestens zwei Zeichen haben soll, und darüber hinaus nur soviele wie nötig. Auch hier hast du also keine feste Länge. Der Compiler von Visual C++ 2008 hält sich hier übrigens nicht an den Standard. Dort hat der Exponent immer 3 Ziffern.

Und schließlich gibt es noch double-Werte, die gar keine Zahlen darstellen, z.B. "inf" oder "nan".

Außerdem solltest du bedenken, dass bei der Formatierung als Text die Werte sehr häufig gerundet werden müssen. Genaue Werte kannst du nur erreichen, indem du die Werte binär speicherst. Dann hättest du auch eine einheitliche Größe, egal wie der Wert aussieht. Allerdings verlierst du dann die Portierbarkeit, denn weder die Größe noch die interne Darstellung von Gleitkommatypen ist standardisiert.

Geschrieben
Moin.

Quizfrage: Warum speicherst Du mit fprintf und liest dann nicht mit fscanf ein?

die Anzahl der Zeichen will ich wissen, um den filepointer mit fseek auf einen der Einträge in der Datei zu setzten, und diesen dann auszulesen.

Geschrieben
Bei dieser Formatierung sind negative Zahlen schon einmal ein Zeichen länger, wegen des Vorzeichens. Das könntest du beispielsweise durch "%+E" oder "% E" (mit Leerzeichen in der Mitte) umgehen.

Der C-Standard sagt, dass der Exponent mindestens zwei Zeichen haben soll, und darüber hinaus nur soviele wie nötig. Auch hier hast du also keine feste Länge. Der Compiler von Visual C++ 2008 hält sich hier übrigens nicht an den Standard. Dort hat der Exponent immer 3 Ziffern.

Und schließlich gibt es noch double-Werte, die gar keine Zahlen darstellen, z.B. "inf" oder "nan".

Außerdem solltest du bedenken, dass bei der Formatierung als Text die Werte sehr häufig gerundet werden müssen. Genaue Werte kannst du nur erreichen, indem du die Werte binär speicherst. Dann hättest du auch eine einheitliche Größe, egal wie der Wert aussieht. Allerdings verlierst du dann die Portierbarkeit, denn weder die Größe noch die interne Darstellung von Gleitkommatypen ist standardisiert.

Vielen Dank für die prompte Antwort, und den Tip.

Der ist echt hilfreich, da es schon sehr auf Genauigkeit ankommt.

Binär speichern muss ich mir dann allerdings noch mal anschaun.

Tja und fseek werde ich denn wohl nicht verwenden können, um einen bestimmten Eintrag zu finden. :(

Das wäre bestimmt schneller gewesen, als meine Funktion die ich jetzt dazu nutze.

Geschrieben
Tja und fseek werde ich denn wohl nicht verwenden können, um einen bestimmten Eintrag zu finden. :(
Wenn du die Daten binär verarbeitest (fread, fwrite), kannst du fseek benutzen, denn dann ist jeder Eintrag sizeof(double) Bytes groß.

Das wäre bestimmt schneller gewesen, als meine Funktion die ich jetzt dazu nutze.
Wenn es auf Geschwindigkeit ankommt, und die Datenmenge nicht zu groß ist, sind vielleicht Memory Mapped Files eine Lösung. Das ist dann aber betriebsystemspezifisch.
Geschrieben
Wenn du die Daten binär verarbeitest (fread, fwrite), kannst du fseek benutzen, denn dann ist jeder Eintrag sizeof(double) Bytes groß.

Wenn es auf Geschwindigkeit ankommt, und die Datenmenge nicht zu groß ist, sind vielleicht Memory Mapped Files eine Lösung. Das ist dann aber betriebsystemspezifisch.

Das die Einträge dann gleich groß sind, stand ja auch schon in deiner letzten Antwort. Hab ich irgendwie übersehen.:upps

Aber schön, dass es geht.:)

Leider ist die Datenmenge zu groß. Das ist genau der Grund, weshalb ich mit Dateien arbeiten muss, und weshalb ich den Kram überhaupt in c schreibe.

Nochmal danke

Geschrieben
Wenn du die Daten binär verarbeitest (fread, fwrite), kannst du fseek benutzen, denn dann ist jeder Eintrag sizeof(double) Bytes groß.

Wenn es auf Geschwindigkeit ankommt, und die Datenmenge nicht zu groß ist, sind vielleicht Memory Mapped Files eine Lösung. Das ist dann aber betriebsystemspezifisch.

Hallo Klozkopp

Es klappt :-)

Vielen Dank für die sehr hilfreichen Tips

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...