Werte aus einer Datei auslesen
-
Hallo!
Ich habe ein Problem beim Auslesen von Werten (Zahlen) aus einer Datei.
In diese Datei werden viele Zahlen geschrieben:fprintf_s(file,"%d%d%d%d%d%d%d%d%d%d%d%f", ...)
und werden so wieder ausgelesen:
float tmp; int val[11]; for(i=0;i<11;i++) { fread(&val[i],sizeof(int),1,file); } fread(&tmp,sizeof(tmp),1,f);
Die Daten stehen korrekt in der Datei. Ausgelesen werden aber sehr kommische Werte, die fast aussehen wie Zeiger-Adressen, bzw. den "Wert" einer uninitialisierten Integer-Variable zu haben scheinen.
Wie bekomme ich die richtigen Werte aus der Datei ausgelesen, bzw. wieso werden überhaupt falsche Werte ausgelesen?-----------------------
Hier mal ein kurzer Auszug des Dateiinhaltes:
411846783201083201083201032757.00000025680897683201083201083201032765.000000 [...]
-
fprintf_s(file,"%d%d%d%d%d%d%d%d%d%d%d%f", ...)
Das ist doch Unsinn, woher weißt du denn, wo eine Zahl zuende ist?
Und
fread
ist ganz falsch. Versuch malfscanf
oder so.
Man kann doch nicht einfach ASCII schreiben und binär lesen. Für eines musst du dich entscheiden.
-
Ich weiß jetzt nicht, was ein "fprintf_s" sein soll, aber sieht so aus, als ob du die Datei als Textdatei schreiben und als Binärdatei lesen willst. Das geht natürlich nicht. Entweder du schreibst du Datei als Textdatei mit fprintf und liest sie dann z.b. fscanf (oder du liest gleich ganze Zeilen mit fgets und parst die mit strtol usw.), oder schreibst sie als Binärdatei mit fwrite und liest sie mit fread (dann aber das 'b' bei fopen nicht vergessen und beachten, dass das keine plattformunabhängigen Dateien werden wenn man nicht aufpasst).
-
Vielen Dank für die Hinweise
Mit einer Kombination aus fwrite und fread hat´s wunderbar geklappt.
-------------------------
Nochmal was anderes:
Der Microsoft (Visual Studio 2010) Kompiler bemängelt bei so ziemlich jeder Standardfunktion, dass diese "unsicher" ist - etwa:warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead.
Wieso sind die ganzen C-Funktionen "unsicher"?
-
bitti1 schrieb:
Der Microsoft (Visual Studio 2010) Kompiler bemängelt bei so ziemlich jeder Standardfunktion, dass diese "unsicher" ist
Das kannst du ignorieren, an den Standardfunktionen ist nichts auszusetzen (abgesehen von gets()), diese _s Funktionen geben wohl teilweise Fehler anders zurück, was aber völlig unnötig und überhaupt nicht "sicherer" ist. Microsoft will dich nur dazu bringen, statt den etablierten, wunderbar portablen Standardfunktionen die speziellen xxx_s Funktionen zu verwenden, so dass dein Programm nur noch unter Windows läuft und die Benutzer deines Programms an Windows gebunden werden. Das gehört zu Microsofts Unternehmensphilosophie (http://en.wikipedia.org/wiki/Embrace,_extend_and_extinguish, konkret ist das die zweite Stufe "extend").
Für C ist Visual Studio ohnehin nicht so geeignet, da es den aktuellen C-Standard (C99) kaum unterstützt.