Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Anzahl der Zeichen bei Speichern von double

Empfohlene Antworten

Veröffentlicht

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.

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?

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.

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.

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.

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.
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

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

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.