Besoin d'aide pour un programme de lecture et d'ecriture de fichier texte [DEBUT
Manu014
Messages postés12Date d'inscriptionvendredi 23 mai 2008StatutMembreDernière intervention13 juin 2008
-
23 mai 2008 à 19:58
cs_jfrancois
Messages postés482Date d'inscriptionvendredi 26 août 2005StatutMembreDernière intervention 5 décembre 2009
-
13 juin 2008 à 19:07
Bonjour à tous,
Je suis actuellement en stage dans un laboratoire d'essais. Le but de mon stage est d'automatiser la prise de mesures en récupérant les informations des divers capteurs sur un PC. Un système d'acquisition traite les signaux et permet d'enregistrer toutes les valeurs sous un fichier .txt
On me demande maintenant de gerer le depouillement de toutes ces valeurs. Je ne suis pas spécialement calé dans la programmation en C mais j'ai tenté un début de code. Mon stage se termine dans 3 semaines et j'ai mon rapport personnel à rédiger ainsi que diverses manipulations à faire chaque jour...
Le premier objectif de ce programme est de trier mes valeurs en fonction d'une valeur de consigne de pression située dans chaque ligne de valeur.
Mon fichier texte est composé de 7 lignes d'en-tête, ensuite chaque valeur est rangée par colonne espacé par une tabulation. La premiere colonne est une date JJ/MM/2008 ensuite un temps relatif en 00h00m00s les autres colonnes sont des chiffres avec 6 décimales.
J'arrive à obtenir toutes les informations de ma ligne (sans utiliser char mais double...) mais il m'est impossible de comparer la fameuse valeur de pression (située dans mon tableau[ba]) dans ma condition, la console passe directement a "else" alors que les valeurs sont de 12 et 8 dans mon fichier de test
Sauriez-vous m'aider et m'expliquer mes erreurs? Meci par avance
//On lit le fichier tant qu'on ne reçoit pas d'erreur (NULL)
while (fgets(ligne, 800, arrive) != NULL)
{
nbdelignes++;//Comptage du nombre de lignes du fichier
}
fclose(arrive);
nbdelignes = nbdelignes-7;
//Réouverture du fichier source
arrive = fopen("resultat.txt","rt");
cs_jfrancois
Messages postés482Date d'inscriptionvendredi 26 août 2005StatutMembreDernière intervention 5 décembre 20092 24 mai 2008 à 00:05
Bonsoir,
Ce programme est plein d'erreurs ! Trop pour détailler. Voici une réécriture rapide qui marche mais qui mériterait des noms de variables significatifs :
// --- Données lues dans une ligne
char szDate[20],szHeure[20];
double dTempsRelatif;
double z;
double aa,ab,ac,ad,ae,af,ag,ah,ai,aj,ak,al,am;
double an,ao,ap,aq,ar,as,at,au,av,aw,ax,ay,az;
double dPressionConsigne;
double bb,bc,bd,be,bf,bg;
// --- Buffer de lecture d'une ligne
char szBuffer[800];
// --- Divers
int i,iCompteurLignes;
// --- Ouvrir le fichier des résultats en lecture
pFichierResultat = fopen("resultat.txt","r");
if (pFichierResultat == NULL)
{
printf("*** ERREUR A L'OUVERTURE DU FICHIER resultat.txt ***\n");
goto fin_erreur;
}
// --- Ouvrir les fichiers finaux en écriture
pFichierCycle0 = fopen("Cycle0bar.txt","w");
if (pFichierCycle0 == NULL)
{
printf("*** ERREUR A L'OUVERTURE DU FICHIER Cycle0bar.txt ***\n");
goto fin_erreur;
}
pFichierCycle0ESS = fopen("Cycle0bar+ESS.txt","w");
if (pFichierCycle0ESS == NULL)
{
printf("*** ERREUR A L'OUVERTURE DU FICHIER Cycle0bar+ESS.txt ***\n");
goto fin_erreur;
}
pFichierCycle8 = fopen("Cycle8bar.txt","w");
if (pFichierCycle8 == NULL)
{
printf("*** ERREUR A L'OUVERTURE DU FICHIER Cycle8bar.txt ***\n");
goto fin_erreur;
}
pFichierCycle10 = fopen("Cycle10bar.txt","w");
if (pFichierCycle10 == NULL)
{
printf("*** ERREUR A L'OUVERTURE DU FICHIER Cycle10bar.txt ***\n");
goto fin_erreur;
}
pFichierCycle12 = fopen("Cycle12bar.txt","w");
if (pFichierCycle12 == NULL)
{
printf("*** ERREUR A L'OUVERTURE DU FICHIER Cycle12bar.txt ***\n");
goto fin_erreur;
}
// --- Lire les 7 lignes de l'en-tête du fichier des résultats
printf("Travail en cours ...\n");
for (i=0 ; i<7 ; ++i)
{
if (fgets(szBuffer,800,pFichierResultat) == NULL)
{
printf("*** ERREUR : FIN PREMATUREE DU FICHIER RESULTAT ! ***\n");
goto fin_erreur;
}
}
// --- Lire les lignes de données
iCompteurLignes = 0;
while (1)
{
// --- Lire une ligne de données
if (fgets(szBuffer,800,pFichierResultat) == NULL) break;
++iCompteurLignes;
// --- Remplacer les virgules décimales par des points décimaux
// --- pour pouvoir décoder les nombres réels
for (i=0 ; i<strlen(szBuffer) ; ++i)
if (szBuffer[i] == ',') szBuffer[i] = '.';
// --- Tracer les données pour tester
if (1)
{
printf("\nLigne %d :\n",iCompteurLignes);
printf("Date=%s Heure=%s Temps relatif=%lf s\n",szDate,szHeure,dTempsRelatif);
printf("Pression de consigne lue = %lf\n",dPressionConsigne);
}
// --- Vérifier la pression
if (dPressionConsigne == 0.)
printf("La pression vaut : %lf\n",dPressionConsigne);
else if (dPressionConsigne == 8.)
printf("La pression vaut : %lf\n",dPressionConsigne);
else if (dPressionConsigne == 10.)
printf("La pression vaut : %lf\n",dPressionConsigne);
else if (dPressionConsigne == 12.)
printf("La pression vaut : %lf\n",dPressionConsigne);
else
printf("Erreur de lecture ...\n");
// system("PAUSE");
// --- Ecrire les données dans le fichier "Cycle0dPressionConsigner.txt"
fprintf(pFichierCycle0
,"%s\t%s"
"\t%lf"
"\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf"
"\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf"
"\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\n"
,szDate,szHeure,dTempsRelatif
,z
,aa,ab,ac,ad,ae,af,ag,ah,ai,aj,ak,al,am
,an,ao,ap,aq,ar,as,at,au,av,aw,ax,ay,az
,dPressionConsigne,bb,bc,bd,be,bf,bg);
}
printf("\n%d lignes de donnees\n",iCompteurLignes);
printf("Le traitement des informations a ete effectue\n");
// --- Fermer les fichiers
fin_erreur:
if (pFichierResultat) fclose(pFichierResultat);
if (pFichierCycle0) fclose(pFichierCycle0);
if (pFichierCycle0ESS) fclose(pFichierCycle0ESS);
if (pFichierCycle8) fclose(pFichierCycle8);
if (pFichierCycle10) fclose(pFichierCycle10);
if (pFichierCycle12) fclose(pFichierCycle12);
system("PAUSE");
return 0;
}
Ce qui donne (avec un fichier resultat.txt contenant l'exemple) :
Travail en cours ...Ligne 1 :
Date=15/05/2008 Heure=19h35m47s Temps relatif=0.000000 s
Pression de consigne lue = 12.000000
La pression vaut : 12.000000
Ligne 2 :
Date=15/05/2008 Heure=19h35m47s Temps relatif=0.095000 s
Pression de consigne lue = 12.000000
La pression vaut : 12.000000
Ligne 3 :
Date=15/05/2008 Heure=19h35m47s Temps relatif=0.202000 s
Pression de consigne lue = 12.000000
La pression vaut : 12.000000
3 lignes de donnees
Le traitement des informations a ete effectue
Appuyez sur une touche pour continuer...
cs_jfrancois
Messages postés482Date d'inscriptionvendredi 26 août 2005StatutMembreDernière intervention 5 décembre 20092 24 mai 2008 à 01:03
Bonne continuation alors !
Mais changez les noms de variables sinon ça va être un calvaire à suivre. J'ai dû en supprimer 2 qui ne correspondaient à aucune donnée dans le fichier (bh et bi).
Manu014
Messages postés12Date d'inscriptionvendredi 23 mai 2008StatutMembreDernière intervention13 juin 2008 24 mai 2008 à 01:18
C'est ce que je compte faire, je vais les nommer selon la mesure qu'elles realisent. J'ai modifié le code pour trier en fonction des pressions les lignes de mesures. Je vais tenter d'employer la meme technique pour trier les differentezs vitesses moteur et réaliser des moyennes sur chaque colonne par palier de vitesse. Merci encore pour le temps passé à réaliser ce "bon code".
Vous n’avez pas trouvé la réponse que vous recherchez ?
Manu014
Messages postés12Date d'inscriptionvendredi 23 mai 2008StatutMembreDernière intervention13 juin 2008 31 mai 2008 à 00:46
Bonsoir à tous!
Je réecris sur mon premier post car j'ai quelques nouveaux soucis...
En effet mon maitre de stage voudrais un programme plus autonome pour gerer l'automatisation des mesures. Il me demande donc de faire un programme qui detecte des paliers (en fonction d'une consigne de vitesse et d'une consigne de pression) en comparant la ligne lue avec la precedente. En m'inspirant du code de jfrançois qui m'a bien aidé, (et je l'en remercie) je bloque. Pour la suite il faudrais que je puisse detecter lla ligne de debut et de fin de mon palier et ce pour chaque palier pour ensuite se placer directement ou je veux dans mon fichier et faire diverses opérations. Je ne vois pas comment stocker ces valeurs sans les ecraser à chaque nouveau tour de boucle...
Voici mon code (désolé je n'ai pas trouver comment l'inserer proprement...) :
// --- Données lues dans une ligne du fichier 1.txt
char szDate[20],szHeure[20];
double dTempsRelatif;
double dat;
double eauin,eauout,huilein,airreserv,ae,Tamb,ag,ah,ai,aj,ak,al,am;
double an,ao,Phuile,Pair,Qair,Bby,couple,Peauin,Qhuile,Peauout,Vmoteur,ay,
ConsigneVmoteur;
double dPressionConsigne;
double bb,bc,bd,be,bf,bg;
// --- Données lues dans une ligne du fichier 2TOR.txt
char date[20], heure[20];
double Tempsrelatif;
double Ess, aa;
// --- Buffer de lecture d'une ligne de chaque fichier
char szBuffer[800];
char Buffer2[800];
// --- Variables diverses
int i,j,a=0;
double tabvitesse[2]={0};
double tabpression[2]={0};
// --- Ouvrir le fichier 1.txt en lecture
pFichier1 = fopen("1.txt","r");
if (pFichier1 == NULL)
{
printf("*** ERREUR A L'OUVERTURE DU FICHIER 1.txt ***\n");
goto fin_erreur;
}
// --- Ouvrir le fichier 2TOR.txt en lecture
pFichier2TOR = fopen("2TOR.txt","r");
if (pFichier2TOR == NULL)
{
printf("*** ERREUR A L'OUVERTURE DU FICHIER 2TOR.txt ***\n");
goto fin_erreur;
}
// --- Ouvrir du fichier final en écriture
pfichiertotal = fopen("Résultats performances.txt","w");
if (pfichiertotal == NULL)
{
printf("*** ERREUR A L'OUVERTURE DU FICHIER Résultats "
"performances.txt ***\n");
goto fin_erreur;
}
// --- Lire les 7 lignes d'en-tête des fichiers résultat et TOR
for (i=0 ; i<6 ; ++i)
{
if (fgets(szBuffer,800,pFichier1) == NULL)
{
printf("*** ERREUR : FIN PREMATUREE DU FICHIER RESULTAT ! ***\n");
goto fin_erreur;
}
}
for (j=0; j<6; j++)
{
if (fgets(Buffer2,800,pFichier2TOR) == NULL)
{
printf("*** ERREUR : FIN PREMATUREE DU FICHIER TOR ! ***\n");
goto fin_erreur;
}
}
/* --- DEBUT DE RECHERCHE DES PALIERS VITESSE/PRESSION */
printf("Recherche des paliers de vitesse/pression en cours...\n");
Si je suis mal parti dans mon code l'idée est la suivante en tout cas :
On compare une ligne par rapport à sa precedente sur deux critères,
si les critères sont egaux alors on passe à la ligne suivante en faisant le meme test.
Au moment ou on detectera que les valeurs sont differentes alors on note c numéro de ligne qui signifie la fin de mon palier, ensuite on continue la lecture du fichier pour trouver les paliers eventuels suivants.
Merci à ceux qui m'auront lu et tenté de comprendre mon problème!
Bonne nuit
C'est à dire : si les vitesses et pressions sont égales ou sont différentes alors on fait x.
Et bien c'est pas du tout ce que cela va faire ! Ca va faire :
C'est à dire quelque chose de pas terrible ! Si les vitesses sont égales et (les pression sont égales ou les vitesses différentes) et les pressions sont différentes alors on fait x !!! Il faut écrire :
cs_jfrancois
Messages postés482Date d'inscriptionvendredi 26 août 2005StatutMembreDernière intervention 5 décembre 20092 31 mai 2008 à 02:05
Je trouve aussi qu'il y a beaucoup trop de fgets() ! Il y a des tas de lignes qui sont lues sans être traitées. Dans l'extrait ci-dessous on traite une ligne sur 2 (et sans tenir compte de la fin de fichier qui peut survenir sur la seconde lecture) !
while (fgets(szBuffer,800,pFichier1) != NULL // 1 sur fichier 1
&& fgets(Buffer2,800,pFichier2TOR) != NULL) // 1 sur fichier 2
{
fgets(szBuffer,800,pFichier1); // 2 sur fichier 1
fgets(Buffer2,800,pFichier2TOR); // 2 sur fichier 2
...
Et pareil pour le while qui précède.
Jean-François
cs_jfrancois
Messages postés482Date d'inscriptionvendredi 26 août 2005StatutMembreDernière intervention 5 décembre 20092 1 juin 2008 à 16:42
Et d'autre part, les tableaux "tabvitesse" et "tabpression" sont initialisés à zéro au début puis comparés puis décalés MAIS où est-ce qu'ils changent de contenu ? Ils restent à zéro du début jusqu'à la fin !
Manu014
Messages postés12Date d'inscriptionvendredi 23 mai 2008StatutMembreDernière intervention13 juin 2008 1 juin 2008 à 16:55
Bonjour,
merci pour votre aide et ves conseils. Pour le moment je n'ai pas encore à faire ce que je veux dans mon code...
Mes consignes tabvitesse et tabpression changent et mon but est de discerner les paliers ou ces deux valeurs sont stables en recupérant la ligne de debut et celle de fin de palier, pour dans une deuxième lecture se placer directement au debut de mes paliers pour traiter les infos. Je sais que le code que j'ai posté ne fait pas cela, mais je vais essayer d'être plus clair dans un prochain message avec un code plus proche de ce que je voudrais faire.
Manu014
Messages postés12Date d'inscriptionvendredi 23 mai 2008StatutMembreDernière intervention13 juin 2008 1 juin 2008 à 23:03
Je viens de terminer un code proche de ce que je veux obtenir au final
Pour le moment j'obtiens des moyennes sur mes paliers. Seulement, d'un point de vue physique, il y a un temps de réponse du systeme vis à vis des températures ou meme des pression et j'aimerais m'affranchir de valeurs erronées qui sont pour le moment comprises dans ma méthide de calcul...
Comment ajouter cette problématique à mon code??
// --- Données lues dans une ligne du fichier 1.txt
char szDate[20],szHeure[20];
double dTempsRelatif;
double dat;
double eauin,eauout,huilein,airreserv,ae,Tamb,ag,ah,ai,aj,ak,al,am;
double an,ao,Phuile,Pair,Qair,Bby,couple,Peauin,Qhuile,Peauout,Vmoteur,ay,
ConsigneVmoteur;
double dPressionConsigne;
double bb,bc,bd,be,bf,bg;
// --- Données lues dans une ligne du fichier 2TOR.txt
char date[20], heure[20];
double Tempsrelatif;
double Ess, aa;
// --- Buffer de lecture d'une ligne de chaque fichier
char szBuffer[800];
char Buffer2[800];
// --- Variables diverses
int i,j,a=0;
double tabvitesse[2]={0};
double tabpression[2]={0};
double tablo[20]={0};
// --- Ouvrir le fichier 1.txt en lecture
pFichier1 = fopen("1.txt","r");
if (pFichier1 == NULL)
{
printf("*** ERREUR A L'OUVERTURE DU FICHIER 1.txt ***\n");
goto fin_erreur;
}
// --- Ouvrir le fichier 2TOR.txt en lecture
pFichier2TOR = fopen("2TOR.txt","r");
if (pFichier2TOR == NULL)
{
printf("*** ERREUR A L'OUVERTURE DU FICHIER 2TOR.txt ***\n");
goto fin_erreur;
}
// --- Ouvrir du fichier final en écriture
pfichiertotal = fopen("Résultats performances.txt","w");
if (pfichiertotal == NULL)
{
printf("*** ERREUR A L'OUVERTURE DU FICHIER Résultats "
"performances.txt ***\n");
goto fin_erreur;
}
// --- Lire les 7 lignes d'en-tête des fichiers résultat et TOR
for (i=0 ; i<=6 ; ++i)
{
if (fgets(szBuffer,800,pFichier1) == NULL)
{
printf("*** ERREUR : FIN PREMATUREE DU FICHIER RESULTAT ! ***\n");
goto fin_erreur;
}
}
for (j=0; j<=6; j++)
{
if (fgets(Buffer2,800,pFichier2TOR) == NULL)
{
printf("*** ERREUR : FIN PREMATUREE DU FICHIER TOR ! ***\n");
goto fin_erreur;
}
}
/* --- DEBUT DE RECHERCHE DES PALIERS VITESSE/PRESSION */
printf("Recherche des paliers de vitesse/pression en cours...\n");
}
fin_erreur :
if (pFichier1) fclose(pFichier1);
if (pFichier2TOR) fclose(pFichier2TOR);
if (pfichiertotal) fclose(pfichiertotal);
printf("Fin du programme de lecture des paliers\n");
system("PAUSE");
return 0;
}
cs_jfrancois
Messages postés482Date d'inscriptionvendredi 26 août 2005StatutMembreDernière intervention 5 décembre 20092 2 juin 2008 à 01:22
Ca ne va toujours pas au niveau de la lecture des fichiers ! Voilà une réécriture avec des variables nommées à partir des libellés dans le fichier de données (si vous êtes en C et non en C++, remplacer bool/true/false par BOOL/TRUE/FALSE pour les traces, tout au début) :
// --- Pointeurs pour accéder aux fichiers
FILE* pFichierIn1 = NULL;
FILE* pFichierIn2 = NULL;
FILE* pFichierOut = NULL;
// --- Buffers de lecture/écriture dans les fichiers
#define TAILLE_BUFFER 800
char szBuffer1[TAILLE_BUFFER];
char szBuffer2[TAILLE_BUFFER];
//char szBufferOut[TAILLE_BUFFER];
// --- Données d'une ligne du fichier 1 en entrée
char szDate1[20],szHeure1[20];
double dTempsRelatif1;
double dTempDAT;
double dTempEauIn,dTempEauOut,dPressionEauIn,dPressionEauOut;
double dTempHuileIn,dPressionHuile,dDebitHuile;
double dTempAirReservoir,dPressionAir,dDebitAir;
double dCoupleMoteur,dVitesseMoteur,dConsigneVitesse;
double dConsignePression;
double dTempAmbiante;
double dBlowBy;
double dTempB81T6,dTempB81T8,dTempB81T16,dB81V2;
double dB83VitC,dB84VitC,dB85VitC,dB86VitC,dB87VitC,dB88VitC;
double dTempAVT9,dTempAVT10;
double dTempART11,dTempART12,dTempART13,dTempART14,dTempART15;
// --- Données d'une ligne du fichier 2 en entrée
char szDate2[20],szHeure2[20];
double dTempsRelatif2;
double dModeESS,daa;
// --- Variables diverses
int i,iCompteur;
double adConsignePression[2] = {0};
double adConsigneVitesse[2] = {0};
double adTablo[20] = {0};
// --- Ouvrir le fichier 1 en entrée
pFichierIn1 = fopen(szFichierIn1,"r");
if (pFichierIn1 == NULL)
{
printf("*** ERREUR A L'OUVERTURE DU FICHIER "%s" ***\n",szFichierIn1);
goto fin_erreur;
}
// --- Ouvrir le fichier 2 en entrée
pFichierIn2 = fopen(szFichierIn2,"r");
if (pFichierIn2 == NULL)
{
printf("*** ERREUR A L'OUVERTURE DU FICHIER "%s" ***\n",szFichierIn2);
goto fin_erreur;
}
// --- Ouvrir le fichier en sortie
pFichierOut = fopen(szFichierOut,"w");
if (pFichierOut == NULL)
{
printf("*** ERREUR A L'OUVERTURE DU FICHIER "%s" ***\n",szFichierOut);
goto fin_erreur;
}
// --- Lire les 7 lignes d'en-tête du fichier 1 en entrée
for (i=0 ; i<7 ; ++i)
{
if (fgets(szBuffer1,TAILLE_BUFFER,pFichierIn1) == NULL)
{
printf("*** ERREUR : FIN PREMATUREE DU FICHIER "%s" ***\n",szFichierIn1);
goto fin_erreur;
}
}
// --- Lire les 7 lignes d'en-tête du fichier 2 en entrée
for (i=0 ; i<7 ; ++i)
{
if (fgets(szBuffer2,TAILLE_BUFFER,pFichierIn2) == NULL)
{
printf("*** ERREUR : FIN PREMATUREE DU FICHIER "%s" ***\n",szFichierIn2);
goto fin_erreur;
}
}
// --- RECHERCHE DES PALIERS VITESSE/PRESSION
printf("Recherche des paliers de vitesse/pression en cours...\n");
iCompteur = 0;
while (1)
{
// --- Lire une ligne dans chaque fichier avec sortie du traitement
// --- si fin de fichier atteinte sur au moins un des fichiers
if (fgets(szBuffer1,TAILLE_BUFFER,pFichierIn1) == NULL) break;
if (fgets(szBuffer2,TAILLE_BUFFER,pFichierIn2) == NULL) break;
// --- Fermer les fichiers
fin_erreur :
if (pFichierIn1) fclose(pFichierIn1);
if (pFichierIn2) fclose(pFichierIn2);
if (pFichierOut) fclose(pFichierOut);
printf("Fin du programme de lecture des paliers\n");
system("PAUSE");
return 0;
}
Le compteur "iCompteur" ("a" dans le programme précédent) est sorti du if/then/else puisqu'il est remis à zéro dans les 2 cas. Mais sa gestion me paraît bizarre pour calculer la moyenne !
Manu014
Messages postés12Date d'inscriptionvendredi 23 mai 2008StatutMembreDernière intervention13 juin 2008 2 juin 2008 à 18:39
Bonjour et merci de ce code bien plus propre!
Pour ce qui est du "icompteur" ça marche tout à fait, j'ai fait le test et je retombe sur la valeur trouvée manuellement.
J'aurais peut être encore une modification à apporter dans le code pour y introduire la gestion d'un compteur à implusions pour calculer avec un autre appareil le débit d'air en m3/h, mais je n'ai pas encore de precisions sur le matériel (meme si le temps me restant pour boucler mon stage a considerablement raccourci...)
Manu014
Messages postés12Date d'inscriptionvendredi 23 mai 2008StatutMembreDernière intervention13 juin 2008 3 juin 2008 à 20:59
Bonjour,
J'essaye en vain de modifier votre code pour affiner la detection de paliers, seulement mes tentatives ont toutes été un echec...
Je cherche à ajouter deux autres conditions dans le if
-Si la vitesse moteur est proche de sa consigne (+/-15)
-Si la pression d'air est proche de sa consigne(+/-1,5)
Lorsque j'ai testé mon ajout de code, je recupérais des valeurs erronées de paliers...
<hr />
En attendant j'ai continué sur mon code actuel dans lequel j'arrive à faire ces deux conditions supplémentaires (les moyennes qui suivent gagnent en précision).
J'ai dû remplacer physiquement l'appareil de mesure de débit d'air par un compteur à gaz délivrant des impulsions à chaque 10 litres qu'il voit passer. J'arrive à traiter son information analogique en 0 ou 1 suivant un seuil que j'ai defini, mais je n'arrive pas par la suite à calculer le débit pour chaque palier...
Voici mon code (Helas sur mon ancien code et non le vôtre pourtant bien meilleur...):
<hr />
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
int main(int argc,char *argv[])
{
// --- Pointeurs des fichiers
FILE* pFichier1 = NULL;
FILE* pFichier2TOR = NULL;
FILE* pfichiertotal = NULL;
FILE* pfichierfinal = NULL;
// --- Données lues dans une ligne du fichier 1.txt
char szDate[20],szHeure[20];
double dTempsRelatif;
double dat;
double eauin,eauout,huilein,airreserv,ae,Tamb,ag,ah,ai,aj,ak,al,am;
double an,ao,Phuile,Pair,QAerzen,Bby,couple,Peauin,Qhuile,Peauout,Vmoteur,ay,
ConsigneVmoteur,Debitcalc;
double dPressionConsigne;
double bb,bc,bd,be,bf,bg;
// --- Données lues dans une ligne du fichier 2TOR.txt
char date[20], heure[20];
double Tempsrelatif;
double Ess, aa;
// --- Buffer de lecture d'une ligne de chaque fichier
char szBuffer[800];
char Buffer2[800];
// --- Variables diverses
int i,j,a=0,b=0,c=10,d=0,e=1000,k=10,z=0,v=0,u=0;
double tabvitesse[2]={0};
double tabpression[2]={0};
double tablo[20]={0};
int Aerzen[2]={0};
int Qaerzen2;
double SaveAerzen[]={0};
double difftemps;
printf("******************************************************\n"
"* Programme de traitement des enregistrements LEXART *\n"
"* Banc J3 - Version AERZEN *\n"
"******************************************************\n\n");
// --- Ouvrir le fichier 1.txt en lecture
pFichier1 = fopen("1.txt","r");
if (pFichier1 == NULL)
{
printf("*** ERREUR A L'OUVERTURE DU FICHIER 1.txt ***\n");
goto fin_erreur;
}
// --- Ouvrir le fichier 2TOR.txt en lecture
pFichier2TOR = fopen("2TOR.txt","r");
if (pFichier2TOR == NULL)
{
printf("*** ERREUR A L'OUVERTURE DU FICHIER 2TOR.txt ***\n");
goto fin_erreur;
}
// --- Ouvrir du fichier impulsions en écriture
pfichiertotal = fopen("Résultats avec Aerzen.txt","w");
if (pfichiertotal == NULL)
{
printf("*** ERREUR A L'OUVERTURE DU FICHIER Résultats "
"avec Aerzen.txt ***\n");
goto fin_erreur;
}
// --- Ouvrir le fichier de resultats finaux en ecriture
pfichierfinal = fopen("Resultats performances.xls","w");
if (pfichierfinal == NULL)
{
printf("*** ERREUR A L'OUVERTURE DU FICHIER Résultats "
"performances.xls ***\n");
goto fin_erreur;
}
fprintf(pfichierfinal,"Cons.V\tCons.P\tDAT\tEau.IN\t"
"Eau.OUT\tHuile\tT.reserv.\tT.amb.\tP.huile\t"
"P.air\tBlow-by\tCouple\tP.eau.IN\t"
"Q.huile\tP.eau.OUT\tV.moteur\tE.S.S.\tQ.air[Aerzen]\n"
"[Tr/min]\t[Bar]\t[Deg.C]\t[Deg.C]\t"
"[Deg.C]\t[Deg.C]\t[Deg.C]\t[Deg.C]"
"\t[Bar]\t"
"[Bar]\t[L/min]\t[N.m]\t[Bar]\t"
"[L/min]\t[Bar]\t[Tr/min]\t[Oui|Non]\t[L/min]\n");
// --- Lire les 7 lignes d'en-tête des fichiers résultat et TOR
for (i=0 ; i<=6 ; ++i)
{
if (fgets(szBuffer,800,pFichier1) == NULL)
{
printf("*** ERREUR : FIN PREMATUREE DU FICHIER RESULTAT ! ***\n");
goto fin_erreur;
}
}
for (j=0; j<=6; j++)
{
if (fgets(Buffer2,800,pFichier2TOR) == NULL)
{
printf("*** ERREUR : FIN PREMATUREE DU FICHIER TOR ! ***\n");
goto fin_erreur;
}
}
// --- Recherche des impulsions AERZEN
printf("Recherche des impulsions du compteur Aerzen...\n\tAvancement : \n");
while(1)
{
if(
fgets(szBuffer,800,pFichier1)!=NULL)
{
// --- Remplacer les virgules décimales par des points décimaux
for (i=0 ; i<strlen(szBuffer) ; ++i)
if (szBuffer[i] == ',') szBuffer[i] = '.';
for (j=0 ; j<strlen(Buffer2) ; ++j)
if (Buffer2[j] == ',') Buffer2[j] = '.';
// --- Analyser le contenu de chaque ligne et mettre AERZEN en TOR
sscanf(Buffer2
,"%s %s %lf"
" %lf %lf"
,date, heure, &Tempsrelatif
,&Ess, &aa);
sscanf(szBuffer
,"%s %s %lf"
" %lf"
" %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf"
" %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf"
" %lf %lf %lf %lf %lf %lf %lf"
,szDate,szHeure,&dTempsRelatif
,&dat
,&eauin,&eauout,&huilein,&airreserv,&ae,&Tamb,&ag,&ah,&ai,&aj,&ak
,&al,&am
,&an,&ao,&Phuile,&Pair,&QAerzen,&Bby,&couple,&Peauin,&Qhuile,&Peauout
,&Vmoteur,&ay,&ConsigneVmoteur
,&dPressionConsigne,&bb,&bc,&bd,&be,&bf,&bg);
if(QAerzen<4.)QAerzen=0;
else QAerzen=1;
fprintf(pfichiertotal
,"%s\t%s"
"\t%lf"
"\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf"
"\t%lf\t%lf\t%lf\t%lf\t%lf\t%.0lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf"
"\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\n"
,szDate,szHeure,dTempsRelatif
,dat
,eauin,eauout,huilein,airreserv,ae,Tamb,ag,ah,ai,aj,ak,al,am
,an,ao,Phuile,Pair,QAerzen,Bby,couple,Peauin,Qhuile,Peauout,Vmoteur,
ay,ConsigneVmoteur
,dPressionConsigne,bb,bc,bd,be,bf,bg);
d++;
}
//Montrer à l'opérateur que le programme fonctionne
if(e==d)
{
printf("
// --- Données lues dans une ligne du fichier 1.txt
char szDate[20],szHeure[20];
double dTempsRelatif;
double dat;
double eauin,eauout,huilein,airreserv,ae,Tamb,ag,ah,ai,aj,ak,al,am;
double an,ao,Phuile,Pair,QAerzen,Bby,couple,Peauin,Qhuile,Peauout,Vmoteur,ay,
ConsigneVmoteur,Debitcalc;
double dPressionConsigne;
double bb,bc,bd,be,bf,bg;
// --- Données lues dans une ligne du fichier 2TOR.txt
char date[20], heure[20];
double Tempsrelatif;
double Ess, aa;
// --- Buffer de lecture d'une ligne de chaque fichier
char szBuffer[800];
char Buffer2[800];
// --- Variables diverses
int i,j,a=0,b=0,c=10,d=0,e=1000,k=10,z=0,v=0,u=0;
double tabvitesse[2]={0};
double tabpression[2]={0};
double tablo[20]={0};
int Aerzen[2]={0};
int Qaerzen2;
double SaveAerzen[]={0}; // dimension
double difftemps;
printf("******************************************************\n"
"* Programme de traitement des enregistrements LEXART *\n"
"* Banc J3 - Version AERZEN *\n"
"******************************************************\n\n");
// --- Ouvrir le fichier 1.txt en lecture
pFichier1 = fopen("1.txt","r");
if (pFichier1 == NULL)
{
printf("*** ERREUR A L'OUVERTURE DU FICHIER 1.txt ***\n");
goto fin_erreur;
}
// --- Ouvrir le fichier 2TOR.txt en lecture
pFichier2TOR = fopen("2TOR.txt","r");
if (pFichier2TOR == NULL)
{
printf("*** ERREUR A L'OUVERTURE DU FICHIER 2TOR.txt ***\n");
goto fin_erreur;
}
// --- Ouvrir du fichier impulsions en écriture
pfichiertotal = fopen("Résultats avec Aerzen.txt","w");
if (pfichiertotal == NULL)
{
printf("*** ERREUR A L'OUVERTURE DU FICHIER Résultats "
"avec Aerzen.txt ***\n");
goto fin_erreur;
}
// --- Ouvrir le fichier de resultats finaux en ecriture
pfichierfinal = fopen("Resultats performances.xls","w");
if (pfichierfinal == NULL)
{
printf("*** ERREUR A L'OUVERTURE DU FICHIER Résultats "
"performances.xls ***\n");
goto fin_erreur;
}
fprintf(pfichierfinal,"Cons.V\tCons.P\tDAT\tEau.IN\t"
"Eau.OUT\tHuile\tT.reserv.\tT.amb.\tP.huile\t"
"P.air\tBlow-by\tCouple\tP.eau.IN\t"
"Q.huile\tP.eau.OUT\tV.moteur\tE.S.S.\tQ.air[Aerzen]\n"
"[Tr/min]\t[Bar]\t[Deg.C]\t[Deg.C]\t"
"[Deg.C]\t[Deg.C]\t[Deg.C]\t[Deg.C]"
"\t[Bar]\t"
"[Bar]\t[L/min]\t[N.m]\t[Bar]\t"
"[L/min]\t[Bar]\t[Tr/min]\t[Oui|Non]\t[L/min]\n");
// --- Lire les 7 lignes d'en-tête des fichiers résultat et TOR
for (i=0 ; i<7 ; ++i)
{
if (fgets(szBuffer,800,pFichier1) == NULL)
{
printf("*** ERREUR : FIN PREMATUREE DU FICHIER RESULTAT ! ***\n");
goto fin_erreur;
}
}
for (j=0; j<7; j++)
{
if (fgets(Buffer2,800,pFichier2TOR) == NULL)
{
printf("*** ERREUR : FIN PREMATUREE DU FICHIER TOR ! ***\n");
goto fin_erreur;
}
}
// --- Recherche des impulsions AERZEN
printf("Recherche des impulsions du compteur Aerzen...\n\tAvancement : \n");
while(1)
{
if (fgets(szBuffer,800,pFichier1) == NULL) break;
if (fgets(Buffer2,800,pFichier2TOR) == NULL) break;
// --- Remplacer les virgules décimales par des points décimaux pour décoder
for (i=0 ; i<strlen(szBuffer) ; ++i)
if (szBuffer[i] == ',') szBuffer[i] = '.';
for (j=0 ; j<strlen(Buffer2) ; ++j)
if (Buffer2[j] == ',') Buffer2[j] = '.';
// --- Montrer à l'opérateur que le programme fonctionne
if (e == d)
{
printf("
\\o/ ");
a = 0;
b++;
v = 0;
if (b == c)
{
printf("\n");
c += 10;
}
}
else
{
a = 0;
}
}
}
tabpression[1] = tabpression[0];
tabvitesse[1] = tabvitesse[0];
tablo[18] = tablo[17];
Aerzen[0] = Qaerzen2;
}
printf("\n\nNombre de paliers detectes : %d"
"\n\nLes resultats ont ete stockes dans le fichier :\n"
"\n\tResultats performances.xls" ,b);
printf("\n\n********************************************************\n"
"* Fin du programme de lecture des paliers *\n"
"********************************************************\n\n");
fin_erreur :
if (pFichier1) fclose(pFichier1);
if (pFichier2TOR) fclose(pFichier2TOR);
if (pfichiertotal) fclose(pfichiertotal);
if (pfichierfinal) fclose(pfichierfinal);
system("PAUSE");
return 0;
}
Manu014
Messages postés12Date d'inscriptionvendredi 23 mai 2008StatutMembreDernière intervention13 juin 2008 4 juin 2008 à 19:16
Merci de ces corrections qui m'avaient echappé!Qu'en est-il de la suite du programme, ma manière de faire est-elle adaptée? On sont les erreurs (car il doit y en avoir vu les resultats que j'obtiens...)?
Manu014
Messages postés12Date d'inscriptionvendredi 23 mai 2008StatutMembreDernière intervention13 juin 2008 4 juin 2008 à 20:05
Merci beaucoup de passer du temps à mon problème. Toutes vos améliorations m'ont permis d'y voir beaucoup plus clair dans la structuration d'un programme en C. Je découvre de nouvelles fonctionalités chaque jour!
cs_jfrancois
Messages postés482Date d'inscriptionvendredi 26 août 2005StatutMembreDernière intervention 5 décembre 20092 5 juin 2008 à 00:41
Voila la nouvelle version avec le reformatage complet et quelques corrections. Je ne peux rien dire de l'exécution, les fichiers de test sont bien trop courts. Bons tests !
// --- Données d'une ligne du fichier 2
char szDate2[20],szHeure2[20];
double dTempsRelatif2;
double dModeESS,daa;
// --- Variables diverses
int i;
int iCompteurTempsRelatif = 0;
int iCompteurMoyenne = 0;
int iCompteurPalier = 0;
int iCompteurTraitement = 0;
int iCompteurSymbole = 0;
int aiAerzen[2] = {0};
double adConsignePression[2] = {0};
double adConsigneVitesse[2] = {0};
double adTablo[20] = {0};
double adTempsAerzen[2] = {0};
double dQaerzen2;
double dDiffTemps;
double dDebitCalcule;
// --- Début
printf("***********************************************************\n"
"* Programme de traitement des enregistrements LEXART *\n"
"* Banc J3 - Version AERZEN *\n"
"***********************************************************\n"
"\n");
// --- Ouvrir en lecture le fichier 1
pFichierIn1 = fopen(szFichierIn1,"r");
if (pFichierIn1 == NULL)
{
printf("*** ERREUR A L'OUVERTURE DU FICHIER "%s" ***\n",szFichierIn1);
goto fin_erreur;
}
// --- Ouvrir en lecture le fichier 2
pFichierIn2 = fopen(szFichierIn2,"r");
if (pFichierIn2 == NULL)
{
printf("*** ERREUR A L'OUVERTURE DU FICHIER "%s" ***\n",szFichierIn2);
goto fin_erreur;
}
// --- Ouvrir en écriture le fichier des impulsions AERZEN
pFichierAERZEN = fopen(szFichierAERZEN,"w");
if (pFichierAERZEN == NULL)
{
printf("*** ERREUR A L'OUVERTURE DU FICHIER "%s" ***\n",szFichierAERZEN);
goto fin_erreur;
}
// --- Ouvrir en écriture le fichier des performances
pFichierPerfo = fopen(szFichierPerfo,"w");
if (pFichierPerfo == NULL)
{
printf("*** ERREUR A L'OUVERTURE DU FICHIER "%s" ***\n",szFichierPerfo);
goto fin_erreur;
}
// --- Lire les 7 lignes d'entête du fichier 1
for (i=0 ; i<7 ; ++i)
{
if (fgets(szBuffer1,TAILLE_BUFFER,pFichierIn1) == NULL)
{
printf("*** ERREUR : FIN PREMATUREE DU FICHIER "%s" ***\n",szFichierIn1);
goto fin_erreur;
}
}
// --- Lire les 7 lignes d'entête du fichier 2
for (i=0; i<7; ++i)
{
if (fgets(szBuffer2,TAILLE_BUFFER,pFichierIn2) == NULL)
{
printf("*** ERREUR : FIN PREMATUREE DU FICHIER "%s" ***\n",szFichierIn2);
goto fin_erreur;
}
}
// --- Recherche des impulsions AERZEN
printf("Recherche des impulsions du compteur Aerzen :\nAvancement : \n");
while (1)
{
// --- Lire une ligne dans chacun des 2 fichiers avec sortie de la boucle
// --- de traitement si la fin d'au moins un des 2 fichiers est atteinte
if (fgets(szBuffer1,TAILLE_BUFFER,pFichierIn1) == NULL) break;
if (fgets(szBuffer2,TAILLE_BUFFER,pFichierIn2) == NULL) break;
// --- Montrer à l'opérateur que le programme fonctionne !
// --- (afficher un symbole toutes les 1000 lignes traitées
// --- avec un saut de ligne à l'écran tous les 10 symboles)
if (++iCompteurTraitement == 1000)
{
iCompteurTraitement = 0;
printf("
[file://\\o/
\\o/
]
");
if (++iCompteurSymbole == 10)
{
iCompteurSymbole = 0;
printf("\n");
}
}
}
printf("\nRecherche des impulsions terminee.\n");
// --- Fermer et rouvrir en lecture le fichier des impulsions AERZEN
fclose(pFichierAERZEN);
pFichierAERZEN = fopen(szFichierAERZEN,"r");
if (pFichierAERZEN == NULL)
{
printf("*** ERREUR A L'OUVERTURE DU FICHIER "%s" ***\n",szFichierAERZEN);
goto fin_erreur;
}
// --- Le fichier 2 est à relire dans la seconde étape :
// --- Se repositionner au début et relire les 7 lignes d'entête
rewind(pFichierIn2);
for (i=0; i<7; ++i)
{
if (fgets(szBuffer2,TAILLE_BUFFER,pFichierIn2) == NULL)
{
printf("*** ERREUR : FIN PREMATUREE DU FICHIER "%s" ***\n",szFichierIn2);
goto fin_erreur;
}
}
// --- Détecter les paliers et calculer les débits correspondants
printf("\nRecherche des paliers :\nAvancement : \n");
iCompteurSymbole = 0;
while (1)
{
// --- Lire une ligne dans chacun des 2 fichiers avec sortie de la boucle
// --- de traitement si la fin d'au moins un des 2 fichiers est atteinte
if (fgets(szBuffer1,TAILLE_BUFFER,pFichierAERZEN) == NULL) break;
if (fgets(szBuffer2,TAILLE_BUFFER,pFichierIn2) == NULL) break;
// --- Montrer à l'opérateur que le programme fonctionne !
// --- (afficher un symbole après toutes les opérations
// --- avec un saut de ligne à l'écran tous les 10 symboles)
printf("
[file://\\o/
\\o/
]
");
if (++iCompteurSymbole == 10)
{
iCompteurSymbole = 0;
printf("\n");
}
}
iCompteurMoyenne = 0;
}
}
adConsignePression[1] = adConsignePression[0];
adConsigneVitesse[1] = adConsigneVitesse[0];
adTablo[18] = adTablo[17];
aiAerzen[0] = (int)dQaerzen2;
}
printf("\nRecherche des paliers terminee.\n\n");
printf("--> Nombre de paliers detectes : %d\n",iCompteurPalier);
printf("--> Resultats dans le fichier : %s\n",szFichierPerfo);
// --- Fermer tous les fichiers
fin_erreur :
if (pFichierIn1) fclose(pFichierIn1);
if (pFichierIn2) fclose(pFichierIn2);
if (pFichierAERZEN) fclose(pFichierAERZEN);
if (pFichierPerfo) fclose(pFichierPerfo);
printf("\n"
"***********************************************************\n"
"* Fin du programme de lecture des paliers *\n"
"***********************************************************\n"
"\n");
system("PAUSE");
return 0;
}