Onko mahdollista kirjoittaa tiedostoon esimerkiksi char muuttujan vain 3 ensimmäistä bittiä?
fwrite
troc
12590
0Äänestä
Muut lukivat myös
Odottaa vastausta
Näihin keskusteluihin ei ole vielä vastattu. Ole ensimmäinen.
Turvaa tilisi vahvistamalla puhelinnumerosi. Voit silloin palauttaa unohtuneen salasanan tekstiviestillä.
Näihin keskusteluihin ei ole vielä vastattu. Ole ensimmäinen.
Vastaukset 12
Vanhimmat
En nyt oikein käsittänyt, miten ne haluat sinne tiedostoon kirjoittaa, mutta tässä olisi minun väsäämä ratkaisu loogista AND:ia käyttämällä.
char c; // Meidän char muutuja.
c = 23; // Annetaan arvoksi vaikkapa 23.
c = c & 7; // AND seitsemällä. 7 = 0000 0111
Sitten tallennat tiedostoon.
jos tarkoitit, että haluat tallentaa kolmen bitin kasoissa, kolme bittiä aina kerrallaan, niin se onkin vähän vaikeampi juttu.
joskus kolme, joskus kuusi, joskus yksi bitti, määrä vaihtelee jatkuvasti.
Miten tahdot ne bitit kirjoittaa? Onko tarkoitus täyttää tavun muut kuin kolme (tai kuusi tai yksi jne.) ensimmäistä bittiä nollalla? Vai onko tarkoitus vain kirjoittaa satunnaisen pituisia binaari-jonoja tiedostoon mahdollisimman lyhyesti (esim. 2 neljän bitin jonoa varais tilaa vain yhden tavun)?
Ensimmäiseen vaihtoehtoon:
void writeBits(char c, int numberOfBits, FILE *file){
char foo = (c >> numberOfBits)
>Vai onko tarkoitus vain kirjoittaa satunnaisen pituisia binaari-jonoja tiedostoon mahdollisimman lyhyesti (esim. 2 neljän bitin jonoa varais tilaa vain yhden tavun)?
Jep, tämä on tarkoitus..
>Silloin vaan kirjotat ensin muistiin, ja tiedostoon vasta
Niin ajattelinkin, mutta jos puskurissa on jo vaikka 6 bittiä, ja pitäisi lisätä vielä vaikka 5, niin se ei mahdu enää puskuriin. Enkä keksi mitään fiksua ratkaisua.
Pidät aina lukua siitä, montako bittiä puskurissa on. Aina ennen kuin kirjoitat puskuriin lisää, tarkistat, onko uuden binäärijonon pituus suurempi kuin puskuriin (joka siis on yhden tavun mittanen) vielä mahtuvien bittien määrä. Jos se on suurempi, otat vaan (8-bittienMääräPuskurissa) ensimmäistä bittiä siitä uudesta binäärijonosta, kirjotat puskurin levylle ja sitten alotat uuden puskurin, johon kirjotat ne loput bitit siitä kyseisestä binäärijonosta.
Miten voi yhdistää kaksi bittijonoa?
Esim: puskurissa on kolme bittiä (alusta):
11100000
Ja pitäisi lisätä puskuriin neljä viimeistä bittiä bittijonosta:
00001111
Eli lopputulos olisi:
11111110
Itse tekisin puskurin niin päin, että bitit lisätään oikealta. Ts, jos puskuri on tyhjä, ja siihen lisätään jono 110, on puskuri seuraavanlainen: 00000110.
Hyvin lyhyt ja puutteellinen koodi:
void writeBits(int buffer, int *bitsInBuffer, char c, int numberOfBits){
//Nollataan muut, kuin halutut bitit tavusta.
//Tää lienee huono keino (joskin toimiva), mutta kun ei nyt jaksa pohtia parempaa...
c = (c > (8-numberOfBits);
int newBits = (int)c;
//Tehdään tilaa bufferiin.
buffer
>Luetaan kahdeksan bittiä _vasemmalta_, ja kirjotetaan ne tiedostoon yhtenä tavuna
Tämä on vaikein osuus. En keksi miten tuo onnistuu.
fputc((char)((buffer >> (bitsInBuffer-8)) & 0xff), stdout);
http://cs.stadia.fi/~silander/ohjelmointi/c_opas--17.html
http://groups.google.fi/groups?hl=fi&lr=&ie=UTF-8&th=771a014dbec41b72&seekm=9c0rcq[email protected]&frame=off