begin process at 2012 05 27 16:19:29
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Astuces

 > FICHIER BINAIRE FREAD FWRITE

FICHIER BINAIRE FREAD FWRITE


 Information sur la source

Note :
3,67 / 10 - par 3 personnes
3,67 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Astuces Niveau :Débutant Date de création :16/07/2004 Vu :21 498

Auteur : xian240482

Ecrire un message privé
Commentaire sur cette source (7)
Ajouter un commentaire et/ou une note

 Description


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

  • #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;
  • }
#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!


 Sources du même auteur

Source avec Zip OBJET CLIENT SERVEUR TCP / IP WINDOWS MILTITACHE
Source avec Zip PILE CLASS TEMPLATE OPERATOR
Source avec Zip THREAD, SEMAPHORE, ZONE CRITIQUE ET MUTEX WINDOWS

 Sources de la même categorie

Source avec Zip SCHEDULER RR FIFO par yvesB87
Source avec Zip ALGORITHMES RÉCURSIFS VS ALGORITHMES ITÉRATIFS par yvesB87
Source avec Zip Source avec une capture C++ FORMAT D'IMAGE AVEC QT par pop70
Source avec une capture EXEMPLE DE POINTEURS DE FONCTION par pop70
Source avec Zip Source avec une capture [C++] CLASS REGISTER par Miwik

Commentaires et avis

Commentaire de vecchio56 le 16/07/2004 11:59:12 administrateur CS

Qu'est ce que tu racontes?? On peut écrire les octets 25 et 26 sans problèmes, c'est la deuxième partie de ton main qui ne marche pas.
Un fichier binaire s'ouvre en "wb" et pas en "w"

Commentaire de BruNews le 16/07/2004 12:26:44 administrateur CS

Et en appelant direct les fonctions de Windows, pas de probleme c'est toujours binaire car aucune couche d'interpretation au milieu, aspire ou tamponne des paquets d'octets tout simplement.

Commentaire de fumiste le 16/07/2004 13:42:22

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.

Commentaire de Scalpweb le 16/07/2004 15:32:25

Sinon, bonne prog je trouve

Commentaire de snip8 le 03/08/2004 14:36:16

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.

Commentaire de BruNews le 03/08/2004 14:39:44 administrateur CS

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.

Commentaire de yoannyoannyoann le 08/04/2007 20:21:48

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;

  }

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,764 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales