#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