paka Geschrieben 14. Mai 2009 Geschrieben 14. Mai 2009 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.
Hexagon Geschrieben 15. Mai 2009 Geschrieben 15. Mai 2009 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?
Klotzkopp Geschrieben 15. Mai 2009 Geschrieben 15. Mai 2009 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.
paka Geschrieben 15. Mai 2009 Autor Geschrieben 15. Mai 2009 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.
paka Geschrieben 15. Mai 2009 Autor Geschrieben 15. Mai 2009 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.
Klotzkopp Geschrieben 15. Mai 2009 Geschrieben 15. Mai 2009 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.
paka Geschrieben 15. Mai 2009 Autor Geschrieben 15. Mai 2009 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
paka Geschrieben 19. Mai 2009 Autor Geschrieben 19. Mai 2009 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
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden