Salve a tutti, ho realizzato un buffer per operazioni di I/O su di un file a livello di bit. Il buffer prevede le funzioni di apertura, chiusura, lettura e scrittura.
Per testare il buffer ho creato un main in cui riempio il buffer con valori tra 0 e 499 e poi li leggo. Il problema sta che quando eseguo la read sul buffer all'interno di un ciclo for il programma effettua la lettura ma non incrementa il contatore del for. Potreste aiutarmi sto letteralmente sbattendo la testa da 2 giorni.
Ecco il codice del main:
questo e' il codice del buffer:codice:int main() { BITFILE* WBUF=bitfile_open("/home/enzo/Scrivania/test_buffer.txt",MODE_WRITE); for (int var = 0; var < 500; ++var) { bitfile_write(&WBUF,&var,9); } bitfile_close(WBUF); BITFILE* RBUF=bitfile_open("/home/enzo/Scrivania/test_buffer.txt",MODE_READ); int i; int letti; for(i=0;i<10;i++) { printf("i: %d\n",i); int result=bitfile_read(&RBUF,&letti,9); if(result!=-1) printf("letti: %d\n",letti); else printf("err\n"); } }
vi posto anche il punto hcodice:int minimo(int a,int b) { return (a<=b)?a:b; } BITFILE* bitfile_open(char* filename,int mode) { int fd; BITFILE* p; if(mode!=0 && mode !=1) { errno=EINVAL; return NULL; } fd=open(filename,(mode==0?O_RDONLY: ( O_WRONLY | O_CREAT )),0644); if(fd<0) { return NULL; } p=calloc(1,sizeof(BITFILE)); if(p==NULL) { close(fd); errno=ENOMEM; return NULL; } p->FD=fd; p->mode=mode; p->POS=0; return p; } int bitfile_read(BITFILE** _P,uint64_t* D,int LEN) { BITFILE* P=*_P; if(P->mode!=MODE_READ) { printf("Lettura non consentita buffer aperto in modalita' scrittura"); return -1; } int LEN2=LEN; int bit_letti=0; int pos=P->POS; uint64_t D1; int bit_D=0; if(P->LEN==BITBUF_SIZE_IN_BITS || P->POS==0 ) { //printf("carico \n"); int temp=read(P->FD,P->BUF,BITBUF_SIZE); if(temp<=0) return -1; P->LEN=0; P->POS=8*temp; pos=P->POS; LEN2=minimo(LEN2,pos-P->LEN); } while (LEN>0) { LEN2=LEN; if(pos-P->LEN<=0) { int temp=read(P->FD,P->BUF,BITBUF_SIZE); if(temp<=0) return -1; P->LEN=0; P->POS=8*temp; pos=P->POS; D1=*D; bit_D=bit_letti; LEN2=minimo(LEN2,pos-P->LEN); } int to_read=minimo(LEN2,pos-P->LEN); int ultimo=P->LEN+to_read-1; int OFS=ultimo/8; int sx_ofs=ultimo%8; int dx_ofs=0; if(sx_ofs+1<=to_read) to_read=sx_ofs+1; // devo leggere + di quello che posso => leggo solo quello che posso else dx_ofs=sx_ofs-to_read+1; // devo leggere - di quello che posso => leggo solo quello che serve uint8_t MASK=(1<<(sx_ofs+1))-1; *D<<=to_read; *D|=((P->BUF[OFS]&MASK)>>dx_ofs); LEN-=to_read; bit_letti+=to_read; pos-=to_read; } if(bit_D>0) { uint64_t mask; mask=(uint64_t)pow(2,bit_D)-1; while(bit_D>31) { *D<<=31; bit_D-=31; } *D<<=bit_D; *D|=D1 & mask; } P->LEN+=bit_letti-bit_D; *D&=(uint64_t)pow(2,bit_letti)-1; *_P=P; return bit_letti; } int bitfile_write(BITFILE** _P,uint64_t *SRC,int LEN) { BITFILE* P=*_P; uint64_t D=*SRC; if(P->mode!=MODE_WRITE) { printf("Scrittura non consentita buffer aperto in modalita' lettura"); return -1; } uint8_t mask=0; int OFS,K,RES,LEN2; int err; LEN2=LEN; while(LEN2>0) { OFS=P->POS/8; K=P->POS%8; RES=8-K; if(LEN2<RES) //devo scrivere meno di quello che posso RES=LEN2; //segnalo che devo scrivere solo LEN2 mask=(1<<RES)-1; P->BUF[OFS]&=(1<<K)-1; //azzereo i bit da scrivere P->BUF[OFS]|=(D & mask)<<K; //scrivo LEN2-=RES; P->POS+=RES; D>>=RES; if(P->POS >= BITBUF_SIZE_IN_BITS) { err=safe_write(P->FD,P->BUF,BITBUF_SIZE_IN_BITS); P->POS=0; } } *_P=P; return LEN; } int bitfile_close(BITFILE* P) { int err=0; if(P->mode==MODE_WRITE) { err=safe_write(P->FD,P->BUF,P->POS); } close(P->FD); bzero(P,sizeof(BITFILE)); free(P); return err; } int safe_write(int fd,uint8_t* buf,int pos) { if(pos>0) { int OFS=pos/8; if (pos%8!=0) { int K=pos%8; buf[OFS]&=(1<<K)-1; OFS+=1; } int err=write(fd,buf,OFS); return err; } else return 0; }
grazie mille!!codice:#ifndef BITFILE_H_ #define BITFILE_H_ #include <stdint.h> // dimensione del buffer in byte #define BITBUF_SIZE 1 // dimensione del buffer in bit #define BITBUF_SIZE_IN_BITS (BITBUF_SIZE * 8) #define MODE_WRITE 1 #define MODE_READ 0 typedef struct { int POS ; // primo bit libero per scrivere int LEN; // primo bit utilie per leggere int mode; // 0 = READ; 1 = WRITE int FD; // riferimento al file uint8_t BUF[BITBUF_SIZE]; // buffer }BITFILE; BITFILE* bitfile_open(char* nome,int mode); int bitfile_read(BITFILE** P,uint64_t* dst,int LEN); int bitfile_write(BITFILE** P,uint64_t *D,int LEN); int bitfile_close(BITFILE* P); int safe_write(int fd,uint8_t* buf,int byte); int minimo(int a,int b); #endif

Rispondi quotando