Fichier binaire fread fwrite

Soyez le premier à donner votre avis sur cette source.

Snippet vu 23 777 fois - Téléchargée 30 fois

Contenu du snippet

Je ne sais pas si c'est normale ou si c'est la faute de mon ordinateur, de windows .....
Mais j'ai eu de grose difficulté a utilisé les fichiers binaires.
Apres quelque recherche, prise de tete et autre essais, j'ai trouvé qu'il m'était impossible d'ecrire l'octet 25 ou 26. Donc j'ai fait une fonction qui n'ecrit pas ces octets.

J'ai fait un main montrant dans un 1er temps que l'utilisation directe des fonctions fread et fwrite (et ca ne marche pas!) et dans un 2ieme temps l'utilisation des nouvelle fonctions (et ca marche :D)

Source / Exemple :


#include <stdio.h>

#define N1 0
#define N2 1000000

bool Write_Fichier(FILE *fichier, void *data, size_t nb_byte)
{
	char *conversion;

	conversion=(char *) data;

	int i;
	char byte;
	for(i=0;i< (int) nb_byte;i++)
	{
		switch( conversion[i] )
		{
			case 25:
				byte=27;
				if(fwrite(&byte,sizeof(char),1,fichier)<1) return false;
				byte=27;
				if(fwrite(&byte,sizeof(char),1,fichier)<1) return false;
				break;
			case 26:
				byte=27;
				if(fwrite(&byte,sizeof(char),1,fichier)<1) return false;
				byte=28;
				if(fwrite(&byte,sizeof(char),1,fichier)<1) return false;
				break;
			case 27:
				byte=27;
				if(fwrite(&byte,sizeof(char),1,fichier)<1) return false;
				byte=29;
				if(fwrite(&byte,sizeof(char),1,fichier)<1) return false;
				break;
			default:
				byte=conversion[i];
				if(fwrite(&byte,sizeof(char),1,fichier)<1) return false;
				break;

		}
	}

	return true;

}

bool Read_Fichier(FILE *fichier, void* data, size_t nb_byte)
{
	char *conversion;

	conversion=(char*) data;

	int i;
	char byte;
	for(i=0;i<(int) nb_byte;i++)
	{
		if(fread(&byte,sizeof(char),1,fichier)<1) return false;
		switch( byte)
		{
			case 27:
				if(fread(&byte,sizeof(char),1,fichier)<1) return false;
				conversion[i]=byte-2;
				break;
			default:
				conversion[i]=byte;
				break;
		}
	}

	return true;

}

int main(int argc, char* argv[])
{
	printf("Hello World!\n");

	int i;
	int temp;
	FILE *fichier;

	printf("UTILISATION DIRECTE DES FICHIERS BINAIRES\n");
	printf("ecriture d'entier de %i a %i\n",N1,N2);

	fichier=fopen("./truc","w");
	for(i=N1;i<N2;i++)
	{
		fwrite(&i, sizeof(int),1,fichier);	

	}
	fclose(fichier);

	printf("lecture des entier\n");

	fichier=fopen("./truc","r");
	for(i=N1;i<N2;i++)
	{	
		if(fread(&temp,sizeof(int),1,fichier)<1)
		{	printf("probleme fichier, nombre a lire: %i      nombre lut : %i  \n",i,temp);
			break;
		}
		
		if(temp!=i)
		{	printf("probleme nombre, nombre a lire: %i      nombre lut : %i  \n",i,temp);
			break;
		}
	}
	fclose(fichier);

	printf("\n\n\nUTILISATION DES NOUVELLES FONCTIONS\n");
	printf("ecriture d'entier de %i a %i\n",N1,N2);

	fichier=fopen("./truc","w");
	for(i=N1;i<N2;i++)
	{
		Write_Fichier(fichier, &i, sizeof(int));	

	}
	fclose(fichier);

	printf("lecture\n");

	fichier=fopen("./truc","r");
	for(i=N1;i<N2;i++)
	{	
		if(Read_Fichier(fichier,&temp, sizeof(int))==false)
		{	printf("probleme fichier, nombre a lire: %i      nombre lut : %i  \n",i,temp);
			break;
		}
		
		if(temp!=i)
		{	printf("probleme nombre, nombre à lire: %i      nombre lut : %i  \n",i,temp);
			break;
		}
	}
	fclose(fichier);

	printf("\nfin\n");

	return 0;
}

Conclusion :


En esperant que si vous avez le meme probleme, vous economiserez une journée de boulot!

A voir également

Ajouter un commentaire

Commentaires

yoannyoannyoann
Messages postés
3
Date d'inscription
mardi 20 mars 2007
Statut
Membre
Dernière intervention
21 mars 2007
-
voila j'ai un probleme similaire ...
je ne comprends pas le probleme.

#include <stdio.h>
#include <stdlib.h>

int main()
{
FILE * fp;
int test = 3;
int read = 0;
printf("%d \n", read);
int * pointeursurtest = &test;
int * pointerread = &read;
fp = fopen("annuaire.bin", "a+");
fwrite(pointeursurtest,sizeof(int), 1,fp);
fread(pointerread,sizeof(int), 1,fp);
printf("%d" , read);
fclose(fp);
getch();
return 0;

}
BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16 -
snip8 > on est dans le monde 32 bits depuis fort longtemps et le 64 est a nos portes.
int est 32 bits sur processeur 32 bits.
snip8
Messages postés
12
Date d'inscription
samedi 31 juillet 2004
Statut
Membre
Dernière intervention
11 août 2004
-
Y a quand même une belle erreur !

tu stockes 1000000 dans int qui ne peut pas dépasser 32767 donc c'est pas étonnant que sa ne marche pas.

Stocke dans un long.
Scalpweb
Messages postés
1468
Date d'inscription
samedi 13 mars 2004
Statut
Membre
Dernière intervention
5 mai 2010
-
Sinon, bonne prog je trouve
fumiste
Messages postés
2
Date d'inscription
lundi 6 octobre 2003
Statut
Membre
Dernière intervention
16 juillet 2004
-
Oui comme le dis vecchio56, il a raison, les fichier binaires peuvent etre ecrit et lut, sans aucun problem ta juste fais une erreur

pour ouvrir un fichier en binaire (fread,fwrite)
faut utiliser fichier=fopen("fichier","rb")

voila c tout.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.