Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Machma

Frischling

  • »Machma« ist der Autor dieses Themas

Beiträge: 9

Wohnort: Jena

Beruf: Schüler

  • Private Nachricht senden

1

24.01.2004, 16:53

Bits in eine Datei schreiben

Hallo,
Ich habe eine Funktion, sie liefert mir einen float wert (x) und einen int wert (n)
von x sollen nur die ersten n bits in eine Datei geschrieben werden.
Die Funktion kann bis zu 10000 mal aufgerufen werden... und immer unterschiedliche n werte liefern 0...32. Beim schreiben in die Datei darf aber nichts mit 0 "aufgefüllt" werden, sondern alles so wie es kommt.

Kann mir da einer helfen?

MfG

Till

Alter Hase

Beiträge: 378

Wohnort: Lincoln College, Oxford

Beruf: Student

  • Private Nachricht senden

2

24.01.2004, 18:35

Puhhh,

du kannst ja mal versuchen, einen byte-Puffer anzulegen, bei dem du mit den binären Operatoren jedes bit des aktuellen bytes beschreibst und dann das ganze byte (wenn es fertig ist) in die Datei schreibst.

Bleibt bloß die Frage, wie du das letzte byte "halb angebrochen" schreiben sollst!
DOMINVS ILLVMINATIO MEA
---
Es lebe unmanaged Code!
---
>> Meine Uni <<

3

24.01.2004, 19:46

Zitat

Bleibt bloß die Frage, wie du das letzte byte "halb angebrochen" schreiben sollst!
Das ist eine gute Frage. Der Byte-Puffer ist eine gute Idee und die einzige Moeglichkeit einzelne Bits zu schreiben. In der STL gibt es auch ein BIT-Array fertig. Das kannste nehmen.

Da es, so weit ich weis, nicht moeglich ist ein BIT in eine Datei zu schreiben. Wuerde ich sagen du Reservierst am Anfang der Datei 32Bit und schreibst dort rein wieviele Bits in der Datei vorhanden sind. Zum vollen Byte packste dann NULL hintendran.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Machma

Frischling

  • »Machma« ist der Autor dieses Themas

Beiträge: 9

Wohnort: Jena

Beruf: Schüler

  • Private Nachricht senden

4

24.01.2004, 19:57

:)
guuut soviel zum theoretischen, könntet ihr mich da auch mal programmiertechnisch helfen?

Quellcode

1
2
3
4
5
6
7
8
  long bits;
  int count;
  while( fread(&ch, 1, 1, dat) )
  {
    bits=0;
    count = get_bitstream(bits, ch, root);
    //in die Datei schreiben
  }

in der Variable bits steht dann z.B.: 00000000...0001000
und in der Variable count steht die Anzahl der Bits die von rechts aus 'bits' in eine Datei geschrieben werden sollen.

*need somebodys help*

5

26.01.2004, 20:15

Mit Codes kann ich dir jetzt nicht Helfen. Bin erst am Mittwoch wieder zu hause.

Aber die Reihenfolge ist etwa so

Quellcode

1
2
3
4
- Datei zum schreiben oeffnen
- 32Bit Wert in Datei schreiben (Anzahl der Bits die Relevant sind)
- Bit-Array Byte fuer Byte auslesen und in Datei schreiben (die NULLen sollten Automatisch hinzugefuegt werden
- Datei wieder schliessen
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Till

Alter Hase

Beiträge: 378

Wohnort: Lincoln College, Oxford

Beruf: Student

  • Private Nachricht senden

6

27.01.2004, 21:11

Tja, wie gesgagt, ich würde auch so ähnlich vorgehen. Ich habe mir eine Funktion überlegt, die den Byte-Puffer verwaltet:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void WriteBit(std::ofstream &file, bool bit)
{
    static char bytebuffer = 0;
    static char bitcounter = 0;
    char dummy;
    if(bitcounter == 8) // Byte ist voll
    {
        file.write(&bytebuffer,1);
        bitcounter = 0; // "Bitzeiger" zurücksetzen
        bytebuffer = 0; // Puffer leeren
    }
    if(bit)
        dummy = 1;  // Bit setzten
    else
        dummy = 0;  // Bit nicht setzen
    dummy <<= bitcounter;   // Bit an die richtige Stelle bewegen
    bytebuffer |= dummy;    // Bit in den Puffer setzten
    ++bitcounter;
}


Du solltest eben zuerst die Anzahl der relevanten Bits in die Datei schreiben und dann z.B. ein std::bitset benutzen, um die Bits in eine Liste zu speichern.
Mit der obigen Funktion könntest du dann jedes Bit des bitsets iterativ abrufen und schreiben.

PS: ich hoffe, die Funktion funktioniert...hab sie mir gerade eben kurz ausgedacht. :rolleyes:

Vielleicht könnte sich ja ein "Profi" ("DragenMaster?") dazu äußern, denn ich bin eigentlich auch erst ein Anfänger. :rolleyes: :rolleyes: :rolleyes:
DOMINVS ILLVMINATIO MEA
---
Es lebe unmanaged Code!
---
>> Meine Uni <<

7

28.01.2004, 17:49

Die Funktion ist richtig gut. Sehe keinen Grund warum die nicht funktionieren sollte :)

Wenn die Funktion nicht in einer Zeitkritischen Anwendung benutzt werden soll, kannst du das Bit Set auch weglassen und direkt ueber die Funktion deine Bits setzen. Andernfalls ist ein Bit Set natuerlich von Performance wegen besser.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Till

Alter Hase

Beiträge: 378

Wohnort: Lincoln College, Oxford

Beruf: Student

  • Private Nachricht senden

8

28.01.2004, 18:56

@DragonMaster: Danke!

(Leider hört sich: "...bis zu 10 000 Mal aufgerufen..." doch ein WENIG :rolleyes: zeitkritisch an...)
DOMINVS ILLVMINATIO MEA
---
Es lebe unmanaged Code!
---
>> Meine Uni <<

9

28.01.2004, 19:47

;D OK stimmt :angel:
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Till

Alter Hase

Beiträge: 378

Wohnort: Lincoln College, Oxford

Beruf: Student

  • Private Nachricht senden

10

29.01.2004, 17:37

warte mal!

Ich darf doch wohl annehmen, dass im zeitkritischen Bereich nicht jedes Mal die Datei geöffnet und beschrieben wird!!! Man könnte ja die Bits speichern und am Ende mit meiner Funktion in die Datei schreiben... :)
DOMINVS ILLVMINATIO MEA
---
Es lebe unmanaged Code!
---
>> Meine Uni <<

Werbeanzeige