Hilfe mit fread
-
Da kommt immer nicht das Richtige heraus weil du die Sache nicht richtig angehst
Wenn du so eine Datenbankdatei vorliegen hast und willst da brauchbare Info für dein Programm heraus ziehen dann darfst du nicht mit einem einfachen Editor da dran, sondern mit einem Hex-Editor
Wenn du uns dann die erst 10 Zeile zeigen möchtest, oder auch nicht, nimm die passenden Code-Tags sonst gehen Infos verloren.
So nun hast du mehrere Möglichkeiten
Du versuchst das oder auch nicht.So wie du das bislang unvollständig, mit allerlei Vermutungen deinerseits ergänzt, bislang präsentiert hast musst du noch einige weiter Grundlagen begreifen. Wenn du das Ergebnis jemals sehen solltest, wirst du dich fragen warum du auf so etwas Einfaches nicht schon lange drauf gekommen bist. Denn die Stichworte, die du teilweise hier gezeigt hast brauchst du nicht alle, aber dafür andere.
Das der Text aus der Glaskugel - muss nicht zutreffend sein
MfG f.-th.
-
Eigentlich hättest du ja selbst drauf kommen können.
Hier mal ein Codesnipsel:#include <stdio.h> #include <string.h> struct head { unsigned int Id; double val1; double val2; unsigned int CL; } header; int main(int argc, char *argv[]) { FILE *datei_ptr; char dbfile[70]; if(argc != 2) { printf("DB-filename :"); gets (dbfile); if(strstr( dbfile , ".db") == NULL ) strcat( dbfile , ".db"); } else strcpy(argv[1],dbfile); printf("\n control: %s\n", dbfile); datei_ptr = fopen(dbfile, "r"); if(datei_ptr != NULL) { printf("\nDatei %s wurde geoeffnet!\n", dbfile); fread(&header, sizeof(header), 1, datei_ptr); printf("%d | %f\n", header.Id, header.val1); fclose(datei_ptr); } else { printf("\nDatei %s lässt sich nicht oeffnen\n", dbfile); } }
teste das mit deiner Städtedatei und zeige das Ergebnis.
Das ist nicht die komplette Lösung. Da du uns ja Infos vorenthältst und irreführende gibst kann das auch völlig daneben liegen
-
Das
gets (dbfile);
hätte ich jetzt nicht erwartet.
Es ist übrigens auch mit C11 aus dem Standard genommen worden.
-
f.-th. schrieb:
strcpy(argv[1],dbfile);
Sieht ziemlich sinnfrei aus.
-
Ist aus einem alten Projekt nur grob angepasst
Solche Marotten lassen doch Spuren im Netz
-
Hi, danke erstmal für die Hilfe!
teste das mit deiner Städtedatei und zeige das Ergebnis.
Hier mein Ergebnis:
Datei test.db wurde geoeffnet!
0 | 0.000000mfg
-
Und die test.db ist bei dir die Datei mit den Koordinaten und der Städteinfo?
Versuche die Datei so zu erweitern, das du einen kompletten Header deiner Datei ansehen kannst. Oder sind da noch keine Koordinaten drin und ihr sollt die da einfügen?Sonst zeige uns die ersten zehn Zeilen, die dein Hexeditor dir zeigt!
MfG f.-th.
-
ich hoffe mal da sind weniger kritische Codeteile:
Ab Zeile 17:
if(argc != 2) { printf("DB-filename :"); fgets(dbfile, 70, stdin); dbfile[(unsigned)strlen(dbfile) - 1] = 0; if(strstr( dbfile , ".db") == NULL ) strcat( dbfile , ".db"); } else strcpy(dbfile, argv[1]);
ersetzen.
-
Hi,
die Programmüberholung bringt das selbe Ergebnis:
Datei test.db wurde geoeffnet!
0 | 0.000000Einer der Header sieht folgendermaßen aus:
00000000: 20 04 20 20 20 76 A7 3B 4F 3C 5B 44 40 34 0F 60
00000010: -- 5F -- 52 C0 75 20 20 20Ein weiterer so:
00000000: 20 20 20 20 79 5C 54 -- -- -- 47 40 1D -- AE D2
00000010: DD DD 2E 40 7F 20 20 20Vielleicht kann man damit etwas anfangen.
mfg
-
So dann die Frage: Ich bin davon ausgegangen das ein Header sofort am Anfang der "test.db" steht? Ist das bei dir so?
Wenn ja, sollte da bei dir etwas anderes als du zeigst bei meinem Programm heraus kommen.
Hex-Editor: Wenn du hier Zeilen des Hex-Editors schreibst, versuche die als "Code" hier zu zeigen. Ich hoffe mal da kann man das besser lesen.
Ich kann dir jetzt nicht sagen woran es klemmt: In deinem ersten Header sind Koordinaten von New York oder in der Nähe. Das Problem beim Auslesen ist das Synchronisieren. Die Daten sind um 3 Byte verschoben. Warum? Dazu solltest du noch Infos haben. Oder sind die Infos deines Hex-Editors nicht sauber herüber gekommen?
Es können kleine Abweichungen möglich sein:
Koordinaten NY: 40.712778 | 74.005833
Das soweit ich das aus deinem ersten Header rekonstruieren kann.Hab nachgesehen bei deinem 2.Header kann das auch an der Compiler-Optimierung
bei mir liegen - 4 Byte Versatz oder sind da auch Infos verschwunden?MfG f.-th.
-
Der Ort des zweiten Header ist wahrscheinlich in den Alpen
-
Ich warte noch auf jemand im real Life, deshalb zur Info:
Dein erster Header:
00000000: 20 04 20 20 20 76 A7 3B 4F 3C 5B 44 40 34 0F 60
Id? |Breitengrad | Laengen
00000010: -- 5F -- 52 C0 75 20 20 20
grad |CLunter deinen Hex-Infos => die Infos, die drin stecken.
vor Beitengrad bei der Id passt etwas nicht oder es fehlen InfosAch ja, mein Nachtrag zum Quelltext ändert nur etwas an der Funktion, wenn du beim Dateinamen Fehler provozierst mittels fehlerhafter Eingaben
Mehr Infos aus deiner Datei "test.db" bekommst du, wenn du den Quelltext verstehst und entsprechend ergänzt
Wenn alles passt kannst du den Header zwar ganz aus der Datei lesen, aber es wird dir nur die Hälfte angezeigt. Es kann sein, das du da noch etwas anpassen musst, denn wir können aus der Ferne nicht beurteilen wie viel Bytes ein int bei deiner Aufgabe umfasst und ob das in deiner "test.db" mit deinem Compilat übereinstimmt.
MfG f.-th.
-
Ja jetzt hat mich die Optimierung erwischt
Dein erster Header:
00000000: 20 04 20 20 20 76 A7 3B 4F 3C 5B 44 40 34 0F 60 Id? |Breitengrad | Laengen 00000010: -- 5F -- 52 C0 75 20 20 20 grad |CL
-
Hi,
danke für dein Engagement!
Der Ort des zweiten Header ist wahrscheinlich in den Alpen
Ja genau!
... wie viel Bytes ein int bei deiner Aufgabe umfasst ...
Sorry, vielleicht hab ich das vergessen zu erwähnen, Identifier ist unsigned int (32Bit) und die Contentlänge ebenfalls (also unsigned int (32Bit)).
Werde mal probeiren den Sourcode an meine Aufgabenstellung anzupassen, sodass er den Header als auch Content einliest! Kann eine Zeit lang dauern!
mfg
-
Unter Win32 wird das ein wenig schwieriger mit unsigned int (32Bit).
Meine Testumgebung macht da unsigned int (8 Byte). Das sollte man aber einstellen können.Viel Spass damit
f.-th.
-
So, unter win32 mit dem DMC und Compilerschalter -a compiliert und dein Header ist lesbar( Id: 4 Byte ).
Code::Blocks zeigt mir den Schalter nicht?Bei anderen Betriebssystemen oder Compilern kann sein das das so funktioniert oder etwas anderes unternommen werden muss.
MfG f.-th.