Datei-Kuriositäten
-
Hallo!
Ich habe mir ein kleines "Datenbankmodul" programmiert, welches Datensätze aus einer Datenstruktur - auch eine selbsterstellte Klasse - in einer Datei speichert und von dieser auch lädt.
Nun funktioniert auch alles ganz gut. Allerdings nur unter bestimmten Vorraussetzungen.
Intern arbeitet das Datenbankmodul mit wahlfreiem Zugriff. Es werden also munter die Methoden seekg/seekp verwendet. Wenn ich nun innerhalb einer Funktion (F1) Datensätze speicher und lade und dazu dieselbe Instanz der Datenbankklasse verwende, werden beim 2. Laden falsche Zählerwerte (0) für die vorhandenen Datensätze ausgelesen. Komisch ist, beim 1. Laden ist alles OK. Wenn ich nun aber ein für die Speicher- und Laderoutinen jeweils zwei Funktionen F_s und F_l schreiben und diese von F1 aus aufrufe klappt beim mehrmaligem Speicher/Laden alles und die Zählerwerte werden korrekt ausgelesen.
Ich wollte jetzt keinen Code posten, weil das Modul extrem komplex ist. Und selbst ein Ausschnitt würde vermutlich den Rahmen sprengen. Aber ich schätze, dass dieses Phänomen sich auch auf logischem Wege erklären lässt. Nur mir erschliest es sich jetzt gerade überhaupt nicht. Vielleicht hat einer von Euch ähnliche Erfahrungen gemacht und weiß warum das so ist oder hat einfach eine logische Erklärung dafür.
P.S.: Sorry für den langen Text, aber irgendwie musste das Problem ja geschildert werden. Und jeder, der sich die Mühe macht und den ganzen Text liest, bekommt ein virtuelles Bier von mir spendiert. Prost! :xmas1: :xmas2:
-
Auf Anhieb würde mir nur einfallen, daß du seekg mit relativem Bezug verwendest (ios::cur) und dich an der falschen Stelle der Datei befindest.
HaJo. schrieb:
P.S.: Sorry für den langen Text, aber irgendwie musste das Problem ja geschildert werden. Und jeder, der sich die Mühe macht und den ganzen Text liest, bekommt ein virtuelles Bier von mir spendiert. Prost! :xmas1: :xmas2:
Ein Code sagt mehr als tausend Worte
Und richtig schlau dürften wir aus deinem Problem auch erst werden, wenn du es mit Code untermauerst.PS: Übrigens könntest du darüber nachdenken, die Daten während der Arbeit im RAM vorrätig zu halten. Dort geht der Zugriff um einiges schneller und du kannst die Plattenzugriffe auf ein Minimum beschränken.
-
CStoll schrieb:
Auf Anhieb würde mir nur einfallen, daß du seekg mit relativem Bezug verwendest (ios::cur) und dich an der falschen Stelle der Datei befindest.
Hm, was heißt denn hier relativer Bezug? Bei jeder Methode die Daten an fixen Stellen der Datenbank ausließt kommt ein file.seekg(40L) z.B.
CStoll schrieb:
Ein Code sagt mehr als tausend Worte
Und richtig schlau dürften wir aus deinem Problem auch erst werden, wenn du es mit Code untermauerst.Das ist klar. Nur finde ich ich es sehr kompliziert Codefragmente zu posten. Denn irgendwie müsste alles zu sehen sein.

CStoll schrieb:
PS: Übrigens könntest du darüber nachdenken, die Daten während der Arbeit im RAM vorrätig zu halten. Dort geht der Zugriff um einiges schneller und du kannst die Plattenzugriffe auf ein Minimum beschränken.
Vielleicht habe ich mich umständlich ausgedrückt. Die Daten werden lediglich beim Programmstart/-ende aus der Datenbank gelesen bzw. hineingeschrieben. Ich habe jetzt nur zum Testen des DB Engines permanentes Speichern/Laden/Ändern der Datensätze genuzt. Warscheinlich wäre mir dieser "Fehler" im Programmverlauf gar nicht aufgefallen oder erst dann, wenn die Daten futsch sind.
-
Auf diese Art kann Dir keiner Helfen.
Erstelle einen Quellcode, der klein genug zum Posten ist und Dein Problem zeigt. Auf diesem Wege findest Du auch oft selbst den Fehler, weil Du alles noch mal durchgehen musst.
-
Knuddlbaer schrieb:
Auf diese Art kann Dir keiner Helfen.
Erstelle einen Quellcode, der klein genug zum Posten ist und Dein Problem zeigt. Auf diesem Wege findest Du auch oft selbst den Fehler, weil Du alles noch mal durchgehen musst.
Ich habe den ganzen Code schon so oft gedebugged... Aber das es mit etwas Code sinnvoller und einfacher wäre mir zu helfen ist vollkommen richtig. Allerdings sprach CStoll von relativer Positionierung. Was ist denn damit gemeint?
-
Frage zur relativen Positionierung:
Ist das vielleicht relativ
file.seekg(40L);und dieses hier absolut
file.seekg(40L, std::ios::beg);?
-
Schau doch einfach mal in Dein C++ Buch Deiner Wahl zum Thema seek , dann findest Du auch die Informationen betreffend der Positionierungen.
[edit] Jup [/edit]