Hilfe mit fread
-
Liest du dir eigentlich die hier gegebenen Hilfen durch?
Sicherlich nicht, und die Spezifikation zu deiner zentralen Bibliotheksfunktion fread hast du dir auch nicht durchgelesen und verstanden, sonst würdest du nicht ständig auf deiner "5" rumreiten.
-
Liest du dir eigentlich die hier gegebenen Hilfen durch?
Ja, ich lese mir die Hilfen durch. Es ist nicht so, als würde ich nur warten, bis jemand den passenden Code reinstellt.
Es geht mir mehr darum, dass ich bereits einen Code vor mir liegen habe und diesen verstehen will. Ich weis, wenn ich fread sage, dass er einen Header einlesen soll, dann liest er genau einen Header ein!
Was mir hier an der geschichte schleierhaft vorkommt ist, dass file_size im Programm weiterverwendet wird, um die einzelnen Headers und dann die Contents in eine verkettete Liste zu packen. Nur wenn jetzt file_size wie schon besprochen genau die Größe 1 hat, dann sollte eigentlich nur ein Eintrag in der verketteten Liste sein, da ich ja in der jeweiligen Funktion abfrage, wie viele zb. Headers noch vorhanden sind.Als Beispiel:
while(number_of_headers <= file_size)
{
...
}Normalerweise müsste jetzt eine Liste mit einem Eintrag erzeugt werden. Das Programm erzeugt aber eine Liste mit genau der Anzahl von Einträgen, die der Anzahl der im db-File enthaltenen Headers und Contents entspricht! Und deshalb habe ich nachgefragt, ob dass sein kann, dass file_size genau der Anzahl der enthaltenen Headers entspricht, und wenn warum?
mfg
-
Dein file_size hat als 1. Parameter in fread überhaupt nichts zu suchen. Zumindest nicht, wenn er das beinhalten soll, was sein Name aussagt.
Nyquist schrieb:
in eine verkettete Liste zu packen.
Auch das noch.
Wenn du schon am Verständnis von einfachen Dateileseaktionen scheiterst, ist dieses erst recht zuviel für dich.
Konzentriere dich auf das Einlesen einzelner struct-Elemente aus der Datei und das Speichern in einem einfachen Array. Dein akademisch oktroyiertes verk. Listengedöns kannst du anschließend noch machen.
Übrigens wären deine Leseaktionen sehr viel einfacher zu gestalten, wenn für deine beiden Content-Strings jeweils eine max. vorkommende Länge vorgegeben wäre.
-
Woher sollen wir denn das Dateiformat von deiner Datei kennen?
Schau die dir Datei mit einem HEX-Editor/Viewer an. Dann kannst du sehen was an der Stelle in der Datei steht.Aus deinem Ausschnitt v§;O<[D@4 kann man zumindest sehen, das es mit 0x04 anfängt. Wenn danach noch 0x00 0x00 0x00 kommt hast du die Little Endian 32-Bit- Darstellung von 4.
Und wenn duwhile(number_of_headers <= file_size)
machst, hast du 5 Durchläufe.Nochmal:
Dir kann hier kein anderer sagen, wie deine Datei aufgebaut ist.
-
Danke für die hilfreichen Informationen!
Dir kann hier kein anderer sagen, wie deine Datei aufgebaut ist.
Ich will auch gar nicht, dass mir jemand sagt, wie meine Datei aufgebaut ist, ich wollte lediglich wissen, warum file_size genau eine bestimmte Größe hat, wie geschildert!
Übrigens wären deine Leseaktionen sehr viel einfacher zu gestalten, wenn für deine beiden Content-Strings jeweils eine max. vorkommende Länge vorgegeben wäre.
Die Content-Strings sind leider variabel! Und das mit der verketteten Liste ist bereits realisiert worden und funktioniert.
Ich werde mich halt einfach damit abfinden müssen, dass file_size genau die Größe der vorhandenen Headers hat.
mfg
-
Ich lese ja immer wieder gerne das dem Beitragsersteller zur Lösung verholfen wurde. Ich kann auch verstehen, wenn einige 100 Person die selbe Aufgabe haben, das man da nicht komplette Lösungen hier hinein schreibt.
Das Problem, welches die Tippgeber haben, ist das je nach Randbedingungen andere Lösungen angesagt sind.
Es gibt da einmal die Variante das die Länge der Strings in den Daten des Header vorliegen? Oder welche Trennzeichen sind am Ende der Strings? Oder noch eine andere Lösung?
Sind euch die Städte Infos als Datei oder als Text gegeben?
Frage deshalb weil ich kein Trennzeichen oder eine andere Info bei ersten Überfliegen gesehen habe?Dein Struct:
Header:
Id: unsigned int -> Id könnte identity oder ähnliches bedeuten.
val1: Double -> irgend welche Werte - Double gross geschrieben? -> Microsoft?
val2: Double -> lol
CL: unsigned int -> CL ? keine Ahnung? Info zur Stadt oder zu Datenbank?Ist wahrscheinlich nicht von Bedeutung - es gab früher mal eine Datenbank die die Dateiendung .db nutzte.
MfG f.-th.
-
Hi,
Es gibt da einmal die Variante das die Länge der Strings in den Daten des Header vorliegen?
Ja die Länge des Contents liegt im Header vor.
Header:
Identifikator (unsigned int)
Latitude (double)
Longitude (double)
Content-Länge (unsigned int)Content:
Name (c-string)
Beschreibung (c-string)Ja die .db Datei ist höchstwahrscheinlich eine Datenbank Datei. Jedoch kann ich sie weder mit Microsoft Access, OpenOffice Basic und anderen freeware Programmen öffnen, sodass der Header ordnungsgemäß angezeigt wird. Es sind immer die Paar Symbole am Anfang (wahrscheinlich der Header) und dann der Content, bestehend aus Name dann Trennzeichen (wahrscheinlich Leertaste) und die Beschreibung.
Naja und meine Frage, ich weis nicht ob ich sie wirklich so rübergebracht habe wie es sein sollte, war fast von Anfang an, wieso beim fread(...) die file_size genau den Wert der vorliegenden Headers, bzw. Contents im .db-File annimmt! Wie schon gesagt, mit der file_size wird weitergearbeitet, um die gesamten Headers und zugehörigen Contents in eine Liste zu bekommen.
Aber egal, das Programm funktioniert bis dato auch wenn mir das zustandekommen des Werte von file_size immer noch unklar ist. Nach C-Reference sollt da was anderes drin stehen.mfg
-
file_size sollte übersetzt Dateigrösse bedeuten.
Wenn du da weniger bei fread hinein packen solltest, sollte eventuell der Namen angepasst werden. Oder, wenn da die Dateigrösse hinein soll, sollte das Programm das machen.
Aber es kann ja sein das euch der Aufgabensteller Vorgaben mitgegeben hat, die ganz anders aussehen
Koordinaten New York City: 40° 43′ N, 74° 0′ W40.712777777778-74.00583333333310
Irgend etwas in der Art sollte ja beim Lesen heraus kommen. Ist das bei dir der Fall?Mir ist das mit der Content-Länge zwar immer noch nicht ganz klar. Wenn das für jeden der beiden Strings ist, wäre das eine zusätzliche Info. Oder ein Trennzeichen müsste vereinbart sein. Das erste Wort aus dem String kann man ja nicht einfach nehmen. Siehe: La Paz u.s.w. Wenn man von deinem Beispiel ausgeht, könnte man sich ja an den Klammern orientieren. Aber sind die immer da?
MfG f.-th.
-
Hi,
file_size sollte übersetzt Dateigrösse bedeuten.
Ja file_size ist eigentlich nicht der passende Name.
Wenn man von deinem Beispiel ausgeht, könnte man sich ja an den Klammern orientieren. Aber sind die immer da?
Nein die Klammern hab nur ich dazu geschrieben! Der Typ von Identifikator ist unsigned int usw.
Koordinaten New York City: 40° 43′ N, 74° 0′ W40.712777777778-74.00583333333310
Da muss ich dich leider entäuschen, da auch beim Kompilieren immer diese Symbole rausbekomme.
Aber wie schon gesagt, es ist mir jetzt eigentlich nicht mehr so wichtig, warum bei der schlecht benannten file_size genau die Anzahl der vorkommenden Headers in der Datei rauskommt, ich akzeptiere das einfach!mfg
-
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