Datei mit bestimmten Größe??
-
Hallo C-Meister,
ich brauche wirklich Hilfe!
Ich muss für mein Projekt eine exakt x (von Benutzer eingegeben) Byte große Datei(genauer: eine Variable oder ein Paket) ( 1. Bedingung),die drei Integer-Zahlen (3*sizeof(int)=12 Byte) enthält(2. Bedingung), erstellen.
es soll bestens ein Array sein.
malloc() war meine erste Idee. trotzdem komme ich damit auch nicht zurecht, weil man mit malloc nur einen Speicherbereich erstellen kann.

Kurz gesagt, ich brauche einfach nur Hinweise und Ideen ( Maßnahmen).
Konkrete Lösung wäre nett aber nicht unbedingt (Zeit sparen für euch
:p )Ich freue mich auf und bedanke mich für jede Antwort!
Grusssssssss
-
Das ist nicht möglich, da du eben in einem Speicherbereich von 5 Bytes (was der Benutzer ja eingeben kann) keine 12 Bytes gespeichert werden können, ob das jetzt eine Datei oder ein Array ist.
Wenn du dich darauf verlassen kannst, dass eine Zahl >=12 eingegeben wird, kannst du einfach new byte[n] verwenden.typedef unsigned int uint; typedef unsigned char byte; class ContainerFuerDreiIntsMitDemZusatzfeatureKommaBeliebigVielSpeicherBelegenZuKoennen { public: ContainerFuerDreiIntsMitDemZusatzfeatureKommaBeliebigVielSpeicherBelegenZuKoennen(uint nBytes) : mem(new byte[nBytes]) {} ~ContainerFuerDreiIntsMitDemZusatzfeatureKommaBeliebigVielSpeicherBelegenZuKoennen() {delete[] mem;} int& getInt(int index) { assert(index>=0 && index<3); return *(reinterpret_cast<int*>(mem)+index); } private: byte* mem; ];
-
Ich vermute mal, dass die Aufgabenstellung etwas unverständlich formuliert ist. Gibt der Benutzer tatsächlich die Anzahl der Bytes ein, oder nicht doch etwa die Anzahl der Elemente? In beiden Fällen bietet std::vector alles, was du brauchst, lediglich die Berechnung der Vektorgrösse ist unterschiedlich. Da std::vector intern einen linearen Speicherblock belegt ist die Adresse des ersten Elements gleichzeitig der Beginn des Speicherblocks.
#include <cmath> #include <vector> int main() { std::vector<int> Data; // Fall 1: Anzahl der Bytes wird eingegeben Data.resize( ceil( static_cast<double>( ByteCount ) / sizeof( int ) ); // Fall 2: Anzahl der Elemente wird eingegeben Data.resize( ElementCount ); // Zeiger auf Speicherbereich bestimmen (Achtung: Data darf nicht leer sein) if( false == Data.empty() ) { char* MemBlock = reinterpret_cast<char*>( &Data.front() ); } }
-
DocShoe schrieb:
Data.resize( ceil( static_cast<double>( ByteCount ) / sizeof( int ) );Ich schlage vor, ganzzahlig zu bleiben.
Data.resize( (ByteCount + (sizeof(int)-1)) / sizeof(int) );
-
Abgesehen von der fehlenden dritten schliessenden Klammer mache ich das auch.
-
Aber wieso zu
doublecasten, um dann doch wieder abzurunden?
-
Nexus schrieb:
Aber wieso zu
doublecasten, um dann doch wieder abzurunden?man 3 ceil
-
Ups, sorry, peinlicher Fehler...
