Hilfe mit fread



  • 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-string

    Es 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 du while(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.000000

    mfg



  • 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.


Anmelden zum Antworten