Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 17/12/2014, à 06:44

temps

[résolu] C++ uint8_t fin de fichier introuvable

Bonjour,
Je lis un fichier en binaire composé d'informations de 1 octet.
Actuellement j’utilise une boucle qui compare à un tableau contenant les 255 valeurs car quand je remplace le int pour la lecture dans la boucle du while par un uint8_t, la boucle ne trouve pas la fin du fichier et effectue une lecture continue de valeurs qui n'existent pas.
J'utilise un fgetc pour la lecture et != EOF) pour trouver la fin du fichier.

Est-ce que quelqu'un a déja rencontré ce problème et trouvé une solution ?
Genre utiliser fread à la place de fgetc ...

Cordialement

Dernière modification par temps (Le 17/12/2014, à 09:34)


Parce que l'USB bootable est le support des systèmes experts,
Parce que l'USB bootable contient sa propre image au démarrage.
L'USB bootable permet de créer un monde à la dimension de son imagination
https://www.letime.net

Hors ligne

#2 Le 17/12/2014, à 07:05

pingouinux

Re : [résolu] C++ uint8_t fin de fichier introuvable

Bonjour,
As-tu essayé feof ? Voici un extrait du man :

       #include <stdio.h>
       int feof(FILE *stream)
;
       The function feof() tests the  end-of-file  indicator  for  the  stream
       pointed  to by stream, returning nonzero if it is set.  The end-of-file
       indicator can be cleared only by the function clearerr().

Hors ligne

#3 Le 17/12/2014, à 08:09

temps

Re : [résolu] C++ uint8_t fin de fichier introuvable

Bonjour,
Merci pour la réponse.
Maintenant la boucle trouve la fin du fichier, mais si je reprends le contenue du code comparateur qui marche avec int feof(FILE *stream);
l'application ne lit qu'un octet sur deux.
Je vais regarder un peux mieux la boucle.
Je posterai en résolu quand j'aurai la solution, mais je pense que c'est en bonne voie
Cordialement

Dernière modification par temps (Le 17/12/2014, à 08:10)


Parce que l'USB bootable est le support des systèmes experts,
Parce que l'USB bootable contient sa propre image au démarrage.
L'USB bootable permet de créer un monde à la dimension de son imagination
https://www.letime.net

Hors ligne

#4 Le 17/12/2014, à 09:12

pingouinux

Re : [résolu] C++ uint8_t fin de fichier introuvable

Peux-tu montrer la boucle de lecture ?

Hors ligne

#5 Le 17/12/2014, à 09:25

temps

Re : [résolu] C++ uint8_t fin de fichier introuvable

Bonjour,
merci pour la réponse, j'ai pas pi regardé encore, j'ai juste posté pour donner l'info.

L'ancienne technique bien lourde avec le tableau comparateur pour identifier est sur github ici https://github.com/temps9/LecBaul/blob/ … dn2texte.c

et le code qui lit un octet sur deux est

/**cette application convertit le fichier abadie.adn en piste1.txt pour être compatible avec SequenBaul **/
/**pour compiler gcc adn2texte.c -o adn2texte -Wall***/

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdint.h>



#define cecci111 "piste1.txt"
#define josiane1 "abadie.adn"

/***bin a ascii mono*****/

int ouaitu;
int amplitude = 0;
int assemble = 0;
int nbdepoints;
uint8_t force1;
int compte = 1;
int quelpiano;
int quelpiano1;
int quelpiano2;
int quelpiano3;
int quelpiano4;
int quelpiano5;
int quelpiano6;
int quelpiano7;
int quelpiano8;
int quelpiano9;
int quelpiano10;
int quelpiano11;
int quelpiano12;
int quelpiano13;
int quelpiano14;
int quelpiano15;

int main (int argc, char *argv[])
{/*1*/



/*j ouvre mon fichier de donner et mon fichier de sortie*/
FILE* fichierjoa1 = NULL;
FILE* fichierjo1 = NULL;
fichierjoa1 = fopen(cecci111, "w");
fichierjo1 = fopen(josiane1, "rb");


uint8_t abadie = 0;

if (fichierjo1 != NULL)
{/*2*/

if(fichierjoa1 == NULL) 
   {
      perror("Error in opening file");
      return(-1);
   }
   while(1)
   {/*3*/



abadie = fgetc(fichierjo1); /* abadie vient chercher tout ce qui bouge*/
      if( feof(fichierjo1) )
      { 
          break ;
      }


assemble++;
force1 = abadie;
switch (assemble)
{/*4*/
case 1 :
quelpiano = (int)(abadie);
break;
case 2 :
quelpiano1 = (int)(abadie);
break;
case 3 :
quelpiano2 = (int)(abadie);
break;
case 4 :
quelpiano3 = (int)(abadie);
break;
case 5 :
quelpiano4 = (int)(abadie);
break;
case 6 :
quelpiano5 = (int)(abadie);
break;
case 7 :
quelpiano6 = (int)(abadie);
break;
case 8 :
quelpiano7 = (int)(abadie);
break;
case 9 :
quelpiano8 = (int)(abadie);
break;
case 10 :
quelpiano9 = (int)(abadie);
break;
case 11 :
quelpiano10 = (int)(abadie);
break;
case 12 :
quelpiano11 = (int)(abadie);
break;
case 13 :
quelpiano12 = (int)(abadie);
break;
case 14 :
quelpiano13 = (int)(abadie);
break;
case 15 :
quelpiano14 = (int)(abadie);
break;

default:
quelpiano15 = (int)(abadie);

/****fin traitement bin******/
fprintf(fichierjoa1, "%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n", quelpiano , quelpiano1, quelpiano2, quelpiano3, quelpiano4, quelpiano5, quelpiano6, quelpiano7, quelpiano8, quelpiano9, quelpiano10, quelpiano11, quelpiano12, quelpiano13, quelpiano14, quelpiano15);
assemble = 0;
}/***fin du switch***//*4*/

abadie = fgetc(fichierjo1); /* abadie va chercher la suivante*/
}/**fin de la boucle while***//*3*/


fclose(fichierjoa1), fichierjoa1 = NULL;;
}/*2*/
fclose(fichierjo1), fichierjo1 = NULL;;

return 0;
}/*1*/
/***fin bin a ascii mono**********/

J'utilise ghex pour vérifier le contenue de .adn et un éditeur de texte classique pour le contenue .txt

Cordialement

Dernière modification par temps (Le 17/12/2014, à 09:28)


Parce que l'USB bootable est le support des systèmes experts,
Parce que l'USB bootable contient sa propre image au démarrage.
L'USB bootable permet de créer un monde à la dimension de son imagination
https://www.letime.net

Hors ligne

#6 Le 17/12/2014, à 09:33

temps

Re : [résolu] C++ uint8_t fin de fichier introuvable

Oups, Oups, je poste en résolu. Le fait de relire mon code m'a aiguillé.
Merci pour la réponse c'était la bonne solution, c'est moi qui avait conservé

abadie = fgetc(fichierjo1); /* abadie va chercher la suivante*/

en fin de boucle du while !!! c'était utile avec l'ancienne boucle, mais il faut le supprimer.
Cordialement

Dernière modification par temps (Le 17/12/2014, à 09:33)


Parce que l'USB bootable est le support des systèmes experts,
Parce que l'USB bootable contient sa propre image au démarrage.
L'USB bootable permet de créer un monde à la dimension de son imagination
https://www.letime.net

Hors ligne

#7 Le 17/12/2014, à 10:01

pingouinux

Re : [résolu] C++ uint8_t fin de fichier introuvable

Si la taille du fichier que tu lis n'est pas un multiple de 16 octets, tu n'imprimes pas les dernières valeurs.

Hors ligne

#8 Le 17/12/2014, à 14:07

temps

Re : [résolu] C++ uint8_t fin de fichier introuvable

Bonjour,
Merci pour la précision.
J'avais vu, mais le fichier n'a un sens que s'il est composé d'éléments de 16 octets, si il n'y a pas le bon compte ou qu'un octet est déformé le fichier ne fera pas ce pourquoi il a été créé.

Cordialement

P.S. Maintenant le code est corrigé sur github
Il y a une application qui convertit le fichier audio du mode binaire en mode texte (pour sequenbaul).
Il y a une application qui convertit le fichier audio du mode texte en mode binaire (pour lecbaul).
et Il y a une application qui lit les fichiers audio binaire au format .adn.

Dernière modification par temps (Le 18/12/2014, à 04:30)


Parce que l'USB bootable est le support des systèmes experts,
Parce que l'USB bootable contient sa propre image au démarrage.
L'USB bootable permet de créer un monde à la dimension de son imagination
https://www.letime.net

Hors ligne