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. Zitieren
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? Zitieren
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. Zitieren
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. Zitieren
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. Zitieren
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. Zitieren
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 Zitieren
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 Zitieren
Empfohlene Beiträge
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.