Hilfe beim lesen/schreiben von Binärdaten. +Handling mit Variablen
-
Oh das ist ja nett, bei delphi ist das immer 1byte meine ich, das heist ich könnte hier unter C++ auch ein Char 16bit oder 4bit lang sein lassen. Wie du sicher mitbekommen hast komme ich von Delphi und will zu C++. Nur tue ich mir mit den Variablen noch etwas schwer da C++ scheinbar ohne einen VarBlock auskommt. Wie müsste ich denn eine Entsprechende Variable deklarieren?
-
Du kannst gar nicht festlegen ob ein char 8 Bit hat oder nicht. Das ist System- bzw. Compilerspezifisch. Bei allen Compilern die ich kenne, waren es aber 8Bit (und das sind schon einige). Du kannst also davon ausgehen da es so ist. Beim BCB ist es auf jeden Fall so.
Deklaration:char c;
-
C++ ist irgendwie lolig, weil in Delphi muss ich stärk an eine Struktur gebunden. Ich meine damit die var Blöcke etc. jetzt darf ich ja ne variable gleich über all anlegen und dazu auch noch im selben schritt einen wert zu weisen Nice!!! Das einzige was Nervt das der auf die Groß und Kleinschreibung bei den Befehlen und Variablen achtet das ist etwas gewöhnungsbedürftig. Nun müsste ich noch wissen wie kann ich denn ein Char Symbol in eine 11010101 umwandeln gibt es da irgendwelche Tabellen in denen ich sehe welches Char Zeichen welchen Binärcode hinter sich hat. Ich brauche das damit ich das erste Byte direkt manipulieren kann da es 8 Ja/nein Fragen beantworten soll. Bei dein restlichen kann ich das mit Befehlen wie BinToHex HexToBin Ord chr usw. Direkt machen nur das jeweilige erste Byte möchte ich selber manipulieren. Oder muss ich mir erst aus einem Char einen Integer machen dann eine Routine schreiben welche das Char in einen integer wert wandelt mit dem ich dann einen String errechnen in dem ich dann 10111101 stehen habe dann zurück rechne und wieder in hex und dann in Binär?
-
Hallo
Als erstes würde ich dir empfehlen mehr auf deine Rechtschreibung und Grammatik zu achten. Du kannst froh sein wenn sich jemand deine Textwüste überhaupt durchliest.
Zum Thema : wie bereits gesagt sind Bitoperatoren für dich das richtige.
bis bald
akari
-
Dieser Thread wurde von Moderator/in akari aus dem Forum VCL/CLX (Borland C++ Builder) in das Forum C++ verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Kurze frage noch, sehe ich das richtig das der Befehl read mit den entsprechenden parametern die datei Byteweise laden kann oder läd der befehl open die datei immer erst in den speicher und dann lese ich mit dem read befehl die einzelnen Bytes aus dem Speicher? Mir wäre wichtig das er die Daten(Bytes) von der Platte ließt und nicht erst die datei in den Speicherschaufelt.
-
open() öffnet die Datei und darf auch schon einen Teil in einen Zwischenpuffer einlesen, read() und op<< lesen dann normalerweise von diesem Zwischenpuffer - wenn der leer ist, holt der Stream den nächsten Block Daten.
(aber die Größe und Existenz dieses Zwischenpuffers hängt vom System ab - auf jeden Fall wird kaum jemand die komplette Datei sofort in den Speicher lesen)
-
Hallo
In C++ gibt es keine Befehle, und wir wollen auch nicht raten was für ein read du meinst. Also zeig relevanten Code oder nenne den Kontext (std::ifstream? TFileStream?)
Das Streamkonzept an sich ist darauf ausgelegt nur das zu lesen was nötig ist. Die genaue Implementation ist im C++ Standard aber nicht festgelegt.
bis bald
akari
-
Mir open erzeugst du nur ein Handle auf die spezifische Datei bzw den Stream.
Eingelesen werden die Daten erst über ein aufrufen des Befehls read.
-
Hrhr das mit den Bitoperationen ist ja Mega genial, genau das sind die Dinge die ich brauche. Nie wieder Delphi, C++ kann ja viel viel mehr und vor allem weniger umständlich. Bei Delphi soll angeblich der einzige Weg für solche Bit Operationen das umrechnen von integer werten etc. sein. Erstmal ein dickes danke an euch. Ich hoffe mir sei es Verziehen das ich von einem Befehl sprach :-).
Hier mal ein auszug aus meinen Quelltext:
using namespace std; int main(); int laenge; char * puffer; ifstream is; is.open ("65.dat", ios::in|ios::binary ); // Datei oeffnen is.seekg (0, ios::end); // Laenge der Datei bekommen laenge = is.tellg(); is.seekg (0, ios::beg); puffer = new char [1]; is.read (puffer,1); // 1Byte einlesen //is.seekg(1); //Die Position von der aus gelesen werden soll bestimmen. is.close(); delete puffer; // und hier loeschen wir ihn wieder aus dem ArbeitsspeicherWenn ich euch nicht falsch verstanden habe, sollte doch dann nur ein Byte aus der Datei gelesen werden und das direkt von der Platte oder? Es wäre mir wichtig das er vorher nichts in den Speicher lädt denn wenn er erst einen gewissen Teil in den Speicher laden würde und ich dann über seekg aber eine Position in der Datei anspreche welche noch nicht im Speicher liegt dann müsste er das ja hin und her schaufeln und das will ich vermeiden ich will immer genau die Position ansprechen und einlesen die ich auch angebe ohne es aus dem Speicher zu holen!!!
-
Während deiner ganzen seekg()-Sucherei dürfte der Stream noch nichts von der Datei einlesen (obwohl das auch von der Implementierung abhängt). Allerdings kann es durchaus passieren, daß er im Rahmen des read()-Aufurfs prophylaktisch einen größeren Block einliest und nur das erste eingelesene Zeichen weitergibt (dafür werden weitere Leseversuche dann umso schneller erledigt, weil er nur den Puffer-Inhalt ausgeben muß)
PS: Speicher für ein char brauchst du nicht unbedingt vom Heap zu holen. Und wenn du es doch machen willst - per new[] angeforderte Speicherblöcke mußt du mit 'delete**[]** puffer;' wieder freigeben.
-
Hm jetzt wäre es natürlich für mich sehr Interessant zu wissen ob er mehr in den Speicher gelesen hat, wie viel mehr. Am schönsten wäre es natürlich wenn ich das auch irgendwie steuern könnte denn bei einigen dingen wäre das mit dem mehr laden von Interesse bei anderen wiederum ehr unerwünscht.
-
S.Fiege schrieb:
Hm jetzt wäre es natürlich für mich sehr Interessant zu wissen ob er mehr in den Speicher gelesen hat, wie viel mehr.
Dafür gibt es die Methode in_avail() des Stream-Buffers (komplett
datei.rdbuf()->in_avail()).Am schönsten wäre es natürlich wenn ich das auch irgendwie steuern könnte denn bei einigen dingen wäre das mit dem mehr laden von Interesse bei anderen wiederum ehr unerwünscht.
Bei den Standard-Puffern wirst du da nicht viel machen können. Aber du darfst dir gerne eine eigene basic_streambuf<>-Ableitung schreiben, die da etwas differenzierter arbeitet

-
Oh das hört sich schwierig an mit dem ableiten. Also so ne Art Parameter der das mehr einlesen verhindert gibt es nicht zufällig? Wie könnte denn so eine Ableitung aussehen? Gibt es dazu irgendwelche Tutorials wie man eine Ableitung programmiert?
-
S.Fiege schrieb:
Oh das hört sich schwierig an mit dem ableiten. Also so ne Art Parameter der das mehr einlesen verhindert gibt es nicht zufällig?
Nein.
Btw, wenn die Ein/Ausgabe-Geschwindigkeit dein größtes Problem ist, solltest du mal über ein anderes Design nachdenken. Festplattenzugriffe sind (um einige Größenordnungen) langsamer als Speicherzugriffe, von daher ist es durchaus von Vorteil, wenn der Stream nicht jedes Byte einzeln von der Platte saugen muß.
Wie könnte denn so eine Ableitung aussehen? Gibt es dazu irgendwelche Tutorials wie man eine Ableitung programmiert?
Ich hab' gehört, die Boost::IOStream-Bibliothek bietet da recht solide Hilfe. (ich schreib' zwar gerade selber an einer Anleitung dazu für's Magazin, aber die braucht wohl noch eine Weile)
-
Ich habe vor ein Minidatenbanksystem zu programmieren hauptsächlich um die Funktionalität besser zuverstehen, wie so etwas funktioniert (in der Theorie) ist mir weitestgehend klar, jetzt hapert es noch ein wenig an der Umsetzung.
Also für Suchfunktionen wäre es sicher interessant die entsprechende Datei komplett bzw. Teilweise in den Speicher zu lesen. Und dann über den Algorithmus die entsprechenden Byte Bereiche zu lesen und zu untersuchen allerdings sehe ich hier das Problem das wenn ich im gleichen Moment wie ich suche ein Datensatz geschrieben wird der dann nicht mit durchsucht wird. Wobei man das ja mit einem Teilweisen einlesen der Datei abfangen könnte und wenn man am Ende der Datei etwas sucht dann einfach nochmal prüft ob die Daten gleich sind.
Was das ändern von Datensätzen angeht würde dann halt der gesamte Datensatz in den Speicher geladen werden und geändert und erst dann geschrieben. Hat halt nur den Nachteil das diese Änderung verloren wären wenn der Rechner abstürzt.
Ist das soweit Richtig? Es wäre sehr nett von dir wenn du mir mitteilst ob ich da einen Denkfehler habe bzw. was du anders machen würdest.