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:
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");
	}
}
questo e' il codice del buffer:
codice:
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;
}
vi posto anche il punto h
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
grazie mille!!