[C++]czy aby napewno to zapis binarny

0

Dlaczego zapis binarny tutaj nie powoduje zmniejszenia objetosci tekstu ?
Np. przy zapisie 4 zer do binarnego mam wielkosc 4 bajty, czyli taka jak identyczny plik tekstowy...

 

 std::ofstream FILE;
     //name
     FILE.open("plik.dat", std::ofstream::binary);
     int i=0;
     std::string temp;

     while (kopia[i])
     {

         inorder(z, c,  0, kopia[i],temp);  //poprawna funckja tworzaca zawartosc stringa temp (zapisuje do temp dynamiczny prefixowy kod huffmana dla znaku kopia[i])
         //std::cout<<temp<<"|";
         FILE<<temp;
         temp.clear();

         ++i;
     }

     FILE.close();
0

"binarny" nie oznacza "bitowy". chyba w żadnym języku nie ma żadnych standardowych funkcji/metod, które umożliwiałyby zapis bit po bicie. owszem, jest to możliwe, ale nie tak, jak to robisz. poza tym temp zawiera jeden bajt (pomijając kończący \0) - jak chcesz ten jeden bajt zapisać jako jeden bit?

0

aha, dzieki;
no to to komplikuje sprawe, w ogole nie mam pomyslu jak zrobic metode zapisujaca dane bit po bicie do tego pliku binarnego (czytajac cormena zrozumialem, ze wystarczy to po prostu zapisac do pliku binarnego)

masz moze jakis pomysl jakby cos takiego moglo mniej wiecej wygladac ?

0

odczytaj bajt, ustaw/wyzeruj w nim pożądany bit za pomocą operacji logicznych i zapisz ten bajt z powrotem do miejsca, z którego go odczytałeś.
takie przetwarzanie pliku jest skrajnie niewydajne, dużo szybciej będzie operować na tablicy bajtów, w której będziesz ustawiać wartości poszczególnych bitów, a po zakończeniu całej operacji zapiszesz taką tablicę naraz do pliku.

0

czyli cos w stylu:

int tab[100];
for (... ; ...; ...)
{
tab[i]=0 lub tab[i] = 1 //zaleznie od kodu huffmana
}

i na koncu to zapisac do pliku binarnego... ?

0

nie. w ten sposób wykorzystasz co 32 bit. nie rozumiesz, o czym piszę i na tej podstawie wnioskuję, że brakuje Ci podstaw. poczytaj o operacjach logicznych, zobacz jak działają operatory &, |, >> i <<, dowiedz się jak odczytać wartość konkretnego bitu w byte/int (czyli np. odczytanie siódmego bitu x >> 6 & 1 czy zapisanie do czwartego x = x | 1 << 3 & n << 3 ) itp.

zastanów się też nad tym, co sam napisałeś. tablica intów. int ma 32 bity. jeśli ustawisz int i = 1, to ile "i" będzie mieć bitów rozmiaru? jeden? przecież to nadal int, więc ma 32 bity. jak myślisz, co znajdzie się w pliku? otóż 31 bitów zer i jeden z jedynką lub zerem ustawionym przez Ciebie razy długość tablicy. zresztą dlaczego sam nie miałbyś tego sprawdzić?

0

poczytalem to o roznych operatorach bitowych: http://xion.org.pl/files/texts/mgt/html/D_C.html

ale dlaej nie rozumie, jak ta wiedza moze mi sie przydac w moim problemie

0

wywnioskowalem cos takiego:

char tab[10];
for (int i=9; i>=0; i--)
if (tab[i] & 1)
// no to mam 1

  // no to mam 0

ale jak to sie ma do zapsiania tego do pliku bit po bicie

0

Nie da się zapisywać bit po bicie, możesz zapisywać bajt po bajcie. W tym celu operatory bitowe umożliwią Ci ustawienie odpowiednich bitów w bajcie i zapisanie go do pliku.

0
ernest napisał(a)

wywnioskowalem cos takiego:

char tab[10];
for (int i=9; i>=0; i--)
      if (tab[i] & 1) 
          // no to mam 1

      // no to mam 0

ale jak to sie ma do zapsiania tego do pliku bit po bicie

źle wywnioskowałeś.

byte b;
for (int i=0; i < 8; i++)
  if (b >> i & 1) 
    // no to mam 1
  else
    // no to mam 0

gdzie b to kolejny element twojej tablicy

1 użytkowników online, w tym zalogowanych: 0, gości: 1