IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Problème avec fwrite d'un short en binaire


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 34
    Points : 16
    Points
    16
    Par défaut Problème avec fwrite d'un short en binaire
    Bonjour,
    J'ai un petit problème avec la fonction fwrite.
    Je voudrais écrire dans un fichier en binaire donc en "wb" un tableau de short de size variable.

    Donc cela donne ca:
    fwrite(signal_Output,sizeof(short),n,FTestOutput);

    Et le problème c'est que cela fonctionne avec certain fichier mais avec d'autre cela ne fonctionne pas vraiment. Je m'explique quand j'exécute mon programme après l'enregistrement et une fois le programme fini je remarque que les données ne sont pas bonnes dans le fichier (ouvert avec notepad++).
    Au lieu de coder sur 2 octets (taille d'un short) il le code sur 3 j'ai l'impression.

    Est ce que quelqu'un à déjà eu ce soucis?

    Voici mon code entier sinon.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR cmdline, int Show)
    {
    	char *signal_Input;
    	short *signal_Output;
    	FILE *FTestInput;		// Variable de type File servant à l'ouverture et à la lecture du fichier
    	FILE *FTestOutput;
    	char *Nom_fichier;
    	Nom_fichier=(char*)malloc(200*sizeof(char));
    	int size_fichier_temp;
    	short long_name_fich=0;
    	char *Nom_Fichier_Out;
    	Nom_Fichier_Out=(char*)malloc(200*sizeof(char));
    	int i;
    	int j;
    	int k;
    	int n=0;
    	int a;
    	int nb_data=0;
    	int val_temp=0;
    	int diez_temp=0;
    	char temp_signal[7];
     
    	union Config_AM2P TC_Word;			//Structure to know the AM2P configuration
    	short q=0;		//Loop variable
    	short end_array=0;	//Last data to deconcatenate
    	short indice_1=0;		//Index n°1 of deconcatenate data 
    	short indice_2=0;		//Index n°2 of deconcatenate data 
    	short indice_3=0;		//Index n°3 of deconcatenate data 
    	short shift_start=0;	//Shift of the start depending on the satellite mode and the AM2P configuration
     
    	int escap=browse_tdx(Nom_fichier);
    	if(escap==0) return 0;
    	signal_Output=(short*)malloc(516096*sizeof(short));
    	for(i=0; i<516096; i++)
    	{
    		signal_Output[i]=0;
    	}
     
    	FTestInput=fopen(Nom_fichier,"r"); //Chargement du fichier rentré précedement
     
    	fseek(FTestInput,0,SEEK_END);
    	size_fichier_temp=ftell(FTestInput);
    	fseek(FTestInput,0,SEEK_SET);
     
    	signal_Input=(char*)malloc(size_fichier_temp*sizeof(char)); // taille du balayage complet charger depuis le fichier
     
    	if(FTestInput==NULL)
    	{	MessageBox(0,"Erreur de lecture du fichier","Erreur",MB_ICONERROR);
    		return 0;}
    	while(i!=NULL)
    		i=(int)fread(signal_Input,sizeof(char),size_fichier_temp,FTestInput); // Stockage des données dans une variable intermédiaire.
    	if(FTestInput==NULL||ferror (FTestInput))
    	{	MessageBox(0,"Erreur de lecture du fichier","Erreur",MB_ICONERROR);
    		return 0;}
    	k=0;
    	n=0;
    	for(j=0; j<size_fichier_temp; j++)
    	{
    	//	
    		k=0;
    		for(i=0;i<7;i++)
    		{	temp_signal[i]=0;}
     
    		if(signal_Input[j] == 0x23)
    		{	while(signal_Input[j] != 0x0a)
    				{ j++;
    				size_fichier_temp--;}
    		}
    		else
    		{
    			if(signal_Input[j] == 0x2d)
    			{	a=-1;
    				j++;
    			}
    			else
    			{	a=1;}
    			while(signal_Input[j] != 0x0a )
    			{
    				temp_signal[k]=signal_Input[j];
    				if(k>7)
    				{
    					sprintf(Nom_Fichier_Out,"%d",k);				
    					MessageBox(NULL,(LPCSTR)Nom_Fichier_Out,"",MB_OK);
    				}
    				k++;
    				j++;
    			}
    			int nb_ligne=nb_ligne2;	//Variable pour indique le numero de la ligne à laquelle nous voulons commencer
    			int lenght_ligne=0;	//Longeur de la chaine de caractere indiquant le nombre de ligne
    			lenght_ligne=(int)strlen(temp_signal);	//initialisation de la longueur de la chaine
    			int puissance=lenght_ligne-1;	//Puissance est égale à le longueur de la ligne -1
    			int val_compt=0;	//Variable indiquant le code ASCII du nombre dans la chaine de caractere
    			for(i=0; i<lenght_ligne; i++)
    			{	val_compt=(int)temp_signal[i];	//Stockage de la valeur du nombre en ASCII ( par exemple le caractere'1'=49 en int)
    				nb_ligne=nb_ligne + (int)(pow((double)10,puissance)*Table_ASCII[val_compt-48]);// Transcription de la valeur du caractere en sa valeur reelle
    				puissance--;}		//puis multiplication par 10puissance de l'indice de notre caractere et sommation des valeurs obtenu
    			signal_Output[n]=a*nb_ligne;
    			if(lenght_ligne!=0)
    			{	n++;}
    			nb_ligne2=0;
     
    		}
    	}
    	////////////////////////////////////////////////////////////////////////////////////////
     
     
    	for(i=0;i<200;i++)
    	{	Nom_Fichier_Out[i]=0;}
    	long_name_fich = strlen(Nom_fichier);
    	strncpy(Nom_Fichier_Out,Nom_fichier,long_name_fich-4);
    	strcat(Nom_Fichier_Out,"_Convert.tdx");
    	FTestOutput=fopen(Nom_Fichier_Out,"wb");
    	fwrite(signal_Output,sizeof(short),n,FTestOutput);
    	fclose(FTestOutput);
     
    	for(i=0;i<200;i++)
    	{	Nom_Fichier_Out[i]=0;}
    	long_name_fich = strlen(Nom_fichier);
    	strncpy(Nom_Fichier_Out,Nom_fichier,long_name_fich-4);
    	strcat(Nom_Fichier_Out,"_Convert_texte.txt");
    	FTestOutput=fopen(Nom_Fichier_Out,"w");
    	fwrite(signal_Input,sizeof(char),size_fichier_temp,FTestOutput);
    	fclose(FTestOutput);
     
    	MessageBox(NULL,"Transcript Terminée","Transipt",MB_OK);
     
     
    }

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 734
    Points : 31 058
    Points
    31 058
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par gofio79 Voir le message
    Et le problème c'est que cela fonctionne avec certain fichier mais avec d'autre cela ne fonctionne pas vraiment. Je m'explique quand j'exécute mon programme après l'enregistrement et une fois le programme fini je remarque que les données ne sont pas bonnes dans le fichier (ouvert avec notepad++).
    Au lieu de coder sur 2 octets (taille d'un short) il le code sur 3 j'ai l'impression.

    Est ce que quelqu'un à déjà eu ce soucis?
    Salut

    Tu ne peux pas ouvrir avec notepad++ un fichier binaire. Et si tu le fais tu ne peux pas te fier à ce que tu vois car les valeurs du fichier qui ne sont pas visualisables en ascii tu ne les vois pas.

    Si tu veux vérifier que ce qui est dans le fichier est correct, tu n'as que 2 moyens
    1) tu utilises un autre programme pour le lire et afficher son contenu
    2) tu utilises un programme de dump hexa pour visualiser le contenu de ton fichier en hexadécimal

    Mais il n'y a aucun problème avec fwrite(). Tu peux aussi récupérer sa valeur quand tu écris pour vérifier le nombre d'éléments écrits...

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 34
    Points : 16
    Points
    16
    Par défaut
    J'ai oublié de préciser que j'utilisais le module HexEditor de Notepad++.
    Sinon j'ai remarqué un truc étrange.
    Voici le debut d'un fichier qui ne fonctionne pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    # C8
    # 64
    # B2
    # D9
    # 00
    # 14
    # C4
    # 00
    # 00
    # 00
    # 00
    # 00
    128
    Et si je remplace le "1" de 128 par un 3 par exemple (cas d'un fichier qui marche) cela fonctionne correctement.
    Dans mon soft, je supprime les lignes commençant par #, donc je me retrouve avec 128 en première positon.

  4. #4
    Inactif  
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 123
    Points : 130
    Points
    130
    Par défaut n=0
    Bonjour,
    Vérifiez cette ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fwrite(signal_Output,sizeof(short),n,FTestOutput);
    n=0

Discussions similaires

  1. Réponses: 2
    Dernier message: 23/02/2009, 11h23
  2. Problème avec fwrite sous windows
    Par cerede2000 dans le forum C
    Réponses: 43
    Dernier message: 13/10/2008, 10h24
  3. Problème avec fwrite
    Par NeMo_O dans le forum C
    Réponses: 6
    Dernier message: 19/03/2007, 09h20
  4. Réponses: 3
    Dernier message: 28/12/2006, 15h06
  5. Problème avec fwrite() : besoin d'un coup de main
    Par yopuke dans le forum Langage
    Réponses: 2
    Dernier message: 16/04/2006, 09h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo