Salve,
sto creando per esercizio un programmino che legge da file un certo numero di interi compresi tra 0 e 31 e scrive su un file binario il numero di elementi del primo file (32 bit) e ciascuno degli interi (5 bit ciascuno).
il codice è il seguente:
File contenente il main
codice:
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <vector>
#include "bit.h"
int main(int argc, char **argv){
char *src = argv[1];
char *dst = argv[2];
FILE *fp_src = fopen(src, "r");
FILE *fp_dst = fopen(dst, "w");
std::vector<unsigned int> vett;
unsigned int buff;
while(fscanf(fp_src, "%d", &buff) == 1){
vett.push_back(buff);
}
printf("size: %d\n", vett.size());
BitWriter bw = BitWriter(fp_dst);
/* Scrittura del numero di elementi
*/
bw.write(vett.size(), 32);
/* Scrittura degli elementi con 5 bit
*/
for(int i = 0; i < vett.size(); ++i){
bw.write(vett.at(i), 5);
}
fclose(fp_src);
fclose(fp_dst);
return EXIT_SUCCESS;
}
File contente la libreria per scrivere i bit
codice:
struct BitWriter {
private:
FILE *_os;
unsigned char _buf;
int _n;
void write_bit(unsigned int bit) {
_buf = (_buf << 1) | (bit & 1);
++_n;
if (_n == 8) {
printf("scrivo: %x\n", _buf);
fwrite(&_buf, 1, 1, _os);
_buf = 0;
_n = 0;
}
}
public:
BitWriter(FILE *os) {
_n = 0;
_buf = 0;
_os = os;
}
~BitWriter() {
flush();
}
void write(unsigned int val, unsigned int n) {
while (n-- > 0){
write_bit(val >> n);
}
}
void flush() {
while (_n){
write_bit(0);
}
}
};
L'output del programma è il seguente (ovvero la stampa del buffer contenente il byte da scrivere):
size: 10
scrivo: 0
scrivo: 0
scrivo: 0
scrivo: a
scrivo: a
scrivo: af
scrivo: fe
scrivo: c9
scrivo: 39
scrivo: 1a
scrivo: c0
che è proprio come dovrebbe essere, dati numeri che sono contenuti nel file che uso come input.
Il problema è che se apro il file binario tramite un editor esadecimale, manca l'ultimo C0, come se l'ultima fwrite non avesse effetto. Cosa molto strana, dato che stampando sul terminale va tutto bene..
grazie