Hilfe mit fread
-
Hi,
bin auf ein Problem bei fread gestoßen, wo ich irgendwie nicht weiter weis! Und zwar soll von einem .db File mit vorgegebenen Inhalt der Header (fixe Größe) eingelesen werden. Hab dazu schon ein struct für den Header angelegt und jetzt kommt meine Frage.
input_file = fopen((argv[1]), "rb"))
Hab das
fread(&(list->header), sizeof(Header), 1, input_file);
so programmiert.
fread allgemein:
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
Ich weiß jetzt zum Beispiel, dass im zu öffnenden .db File 5 solcher Headers drin sind. Was mich jetzt verwirrt ist das fread. Mit meiner Zeile sag ich ja nur, dass es ein array mit count (1) Elementen der größe size (sizeof(Header)) vom stream (input_file) einlesen und es in Liste am entsprechenden Ort ablegen soll.
Für mich würde das heißen, dass das fread genau einen Header der Datei einliest. Das fread liest jedoch alle 5 Headers ein, warum?
Ein anderes Problem hab ich noch mit den fopen. Kann es sein, dass, wenn man ein .db File öffnet argv[1]+3 schreiben muss. Hab irgendwo im Internet aufgeschnappt, dass da noch drei Zeichen sein sollten "-o=". Kann mir hier vielleicht auch jemand weiterhelfen und sagen, warum das so ist?
mfg
-
Nyquist schrieb:
Ein anderes Problem hab ich noch mit den fopen. Kann es sein, dass, wenn man ein .db File öffnet argv[1]+3 schreiben muss.
Nein.
Nyquist schrieb:
Hab irgendwo im Internet aufgeschnappt, dass da noch drei Zeichen sein sollten "-o=". Kann mir hier vielleicht auch jemand weiterhelfen und sagen, warum das so ist?
Ja, die wollten ihr Programm so schreiben, daß man als Benutzer nicht
programm vokabeln.db
aufruft, sondern
programm -o=vokabeln.db
-
Nyquist schrieb:
Für mich würde das heißen, dass das fread genau einen Header der Datei einliest. Das fread liest jedoch alle 5 Headers ein, warum?
Ich sehe keinen Fehler.
Vielleicht hast Du auch gar keinen Fehler drin.
Hast Du 5 Header echt eingelesen? Oder sah es bei der Anzeige nur so aus, als wären es 5?
-
Wie ist denn Header definiert?
-
Danke erstmal für die Hilfe!
Hast Du 5 Header echt eingelesen? Oder sah es bei der Anzeige nur so aus, als wären es 5?
Mir ist des gesagt wurden, dass es die 5 Headers eingelesen hat! Konnte mir es aber selbst auch nicht vorstellen und deswegen hab ich es gepostet. Hab es jetzt kontrolliert und er liest nur einen Header ein!
Jetzt hab ich aber noch eine Frage:
fread(file_size, sizeof(int), 1, input_file)
dann steht in file_size genau die Anzahl der vorhanden Headers drin, warum?
mfg
-
Wie ist denn Header definiert?
Header:
Id: unsigned int
val1: Double
val2: Double
CL: unsigned int
-
Kommt mir bekannt vor
-
Kommt mir bekannt vor
Ja den Beitrag hab ich auch schon gelesen, nur dass er mir nicht viel weitergeholfen hat. Ist nichts anderes als ein Hausübung, die mehrere leute machen müssen (plus 400).
Trotzdem hoffe ich, dass Ihr mir weiterhelfen könnt!
mfg
-
Bei
fread(file_size, sizeof(int), 1, input_file)
kommt es auch darauf an,
- wie file_size definiert ist
- wie du feststellst, welchen Wert/Inhalt file_size hat
- was in der Datei steht.
-
fread macht keine Fehler (im Gegensatz zu dir;-).
Wenn du fread anweist, 1x Header zu lesen, liest es 1x Header an die angegebene Speicherstelle ein,
wenn du fread anweist, 5x Header zu lesen, liest es 5x Header an die angegebene Speicherstelle ein. Rückgabewert ist die Anzahl erfolgreich gelesener vollständiger Speicherblöcke.
Für eventuelle Bytefolgen-Abhängigkeiten oder/und Datentypgrößen (double ist z.B. nicht immer gleich groß) bist du selbst verantwortlich, d.h. fread nimmt hier keine Prüfungen vor.
-
Bei fread(file_size, sizeof(int), 1, input_file) kommt es auch darauf an,
- wie file_size definiert ist
- wie du feststellst, welchen Wert/Inhalt file_size hat
- was in der Datei steht.Zum Beispiel
In der main ist file_size als unsigned int mit 0 initialisiert und wird der Funktion mittel adress-of-Operator übergeben.unsigned int file_size = 0; readFile(..., &file_size);
FILE *readFile(..., unsigned int *file_size)
In der datei (input_file) steht folgendes:
v§;O<[D@4`‘_€RÀu New York City New York (offiziell The City of New York) ist eine Weltstadt an der Ostküste der Vereinigten Staaten.
Content
name c-string
beschreibung c-stringEs ist zu erwähnen, dass ich hier nur ein Abschnitt hausgenommen wurde. Es gibt mehrere solcher Abschnitte, zb. noch für Singapur usw.
Die Ersten Symbole entstrechen dem Header (habe die Datei nur mit Editor geöffnet), die nächsten zwei Strings dem Content.
Angenommen es sind jetzt 5 solcher Abschnitte in dem .db File enthalten, wieso entspricht die file_size dann genau 5?
FILE *readFile(..., unsigned int *file_size) ... fread(file_size, sizeof(int), 1, input_file); ...
mfg
Ich hoffe ich konnte euch mein Problem so gut es geht schildern!
-
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.