003
19.07.2019, 09:39 Uhr
pauledd
|
Also ich habe mich jetzt mal an die abstrakte Klasse getraut und davon dann eine abgeleitete Klasse erstellt, erstmal nur für den 8bit Fall, nur um zu sehen ob ich ordentlich einlesen kann. Mir ist noch nicht wirklich klar wie das mit "new" und unique_ptr funktioniert. Also habe ich dann in main Block_8t mit new erstellt und lösche es am ende wieder.
Was ich jetzt nicht verstehe ist warum du mein 8bit...
C++: |
unsigned short count; unsigned short overrun; unsigned char data[508];
|
struct zu "unsigned char" geandert hast? Die Blöcke in der Binary sind ja alle 512 Byte groß. Bei den 8bit Daten bestehen die Blöcke alle aus dem count (2 Byte), overrun (2 Byte) und die eigentlichen Daten data (508 Byte), ergibt 512 Byte.
Du hast daraus:
C++: |
unsigned char count; unsigned char overrun; unsigned char data[254];
|
count = 1, overrun = 1, data = 254, zusammen 256 Byte gemacht.
Oder war das nur ein Tippfehler bei dir?
Dann noch eine andere Frage bezüglich:
Zitat: |
wenn man einen reinterpret_cast benutzen muss, ist es meistens ein Zeichen das man kein "echtes" modernes C++ schreibt
|
Ich komme einfach nicht drauf wie ich dem ifstream::read(char* s, streamsize n) die Daten korrekt entlocken soll ohne "reinterpret_cast" ?
Ich verstehe auch nicht wie das stattdessen mit "this" funktionieren soll. Woher nimmt das "this" die einzulesende Größe von 512 Byte?
Und warum du die variablen in Block8 public machst? Ist das alles beabsichtigt?
Hier ist mal der Code soweit wie ich gekommen bin, ich lese mit
C++: |
buf.read(reinterpret_cast<char*>(&count), sizeof(count));
|
erstmal nur "count" ein, das klappt auch, er liest nur die ersten zwei Byte ein.
C++: |
#include <iostream> #include <fstream>
class BlockBase{ public: virtual void read(std::ifstream &buf) = 0; virtual ~BlockBase(){}; };
class Block_8t : public BlockBase { private:
public: virtual void read(std::ifstream &buf) override { buf.read(reinterpret_cast<char*>(&count), sizeof(count)); std::cout << count << '\n'; } unsigned short get_Count(){ return count; } void printSize(){ std::cout << "size1:" << sizeof(*this) << '\n'; } unsigned short count; unsigned short overrun; unsigned char data[508]; };
int main(int argc, char **argv) { std::string file; file = argv[1]; std::ifstream ifile(file, std::ios::binary); if(!ifile){ std::cout << "file open ERROR!\n"; } Block_8t *b = new Block_8t; b->printSize(); b->read(ifile); ifile.close(); delete b; return 0; }
|
Zum Spaß habe ich mal versucht die Größe von this auszugeben und da sagt er mir 520 Byte, also kann das mit this schon mal nicht funktionieren, es müssten ja 512 Byte sein.
Bitte um Erleuchtung Dieser Post wurde am 19.07.2019 um 09:40 Uhr von pauledd editiert. |