PB ACQSUISITION EN C++, SI UN CRACK EN INFO PEUT ME FAIRE TOURNER CE

PB ACQSUISITION EN C++, SI UN CRACK EN INFO PEUT ME FAIRE TOURNER CE - C++ - Programmation

Marsh Posté le 07-04-2006 à 22:08:56    

voilà, je dois acquérir un fichier de ce type :
 
79,74 -2,15 6,76 1,70
83,46 4,71 3,79 4,33
91,36 2,73 5,68 5,61
92,60 1,24 6,33 11,44
101,58 2,48 3,30 19,94
102,94 -4,47 6,97 22,74
107,29 4,27 5,77 31,30
116,45 4,00 5,51 32,54
126,33 1,85 3,65 33,27
135,14 4,21 6,61 39,13
135,88 0,11 4,53 40,97
140,04 3,22 3,86 46,87
143,63 3,22 3,96 51,29
143,63 -1,60 3,19 55,35
149,36 -1,82 5,35 61,55
154,28 3,23 4,29 68,92
154,86 0,71 3,86 77,24
157,25 4,01 6,82 81,54
161,72 3,21 6,77 89,73
171,27 -3,87 3,92 90,50
180,74 -1,30 6,06 94,30
189,06 -1,11 6,79 97,43
196,57 -0,57 3,34 105,24
196,68 3,45 6,98 106,13
199,86 4,16 4,61 106,37
208,05 -0,07 5,30 107,10
214,27 3,87 6,72 112,01
223,34 -3,35 6,57 121,74
229,04 -3,00 4,61 127,55
236,42 3,89 4,30 128,47
240,01 3,62 5,21 131,62
249,77 0,08 3,47 132,55
257,30 1,02 4,56 141,02
262,94 -0,15 3,94 145,55
272,81 -2,27 5,82 151,94
 
dans un tableau de dimension 2 .
JE PROGRAMME EN VISUAL STUDIO NET
 
voici le pgm que j'utilise :
#include <fstream>
#include <malloc.h>  
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>  
                               // strtok() -> decoupage de chaine de caracteres  
                               // atoi -> convertir une chaine de caractere en un entier  
   
                   
                   // Nombre de colonne maximum du tableau  
#define MAX_CHAR_PER_LINE    12                // Nombre de caratere maximum par ligne dans le fichier lu : 3*400+400+1 = 1601 mais j'ai mis 1650 pour arrondir  
#define SEP                    " "                    // Séparateur utilisé dans le fichier  
#define PATH                "C:\\MESURE1.txt"        // Mets l'emplacement de ton fichier contenant les valeurs  
   
   
int main(int argc, char* argv[])  
{  
    FILE*    m_File;  
    int        i = 0;  
    int        j;  
    float    Tab[4000][5];  
    char    szbuff[MAX_CHAR_PER_LINE];  
    char*    token;  
   
     
     
    // On initialise le tableau a -1  
    for(i=0;i<4000;i++)  
    {  
        for(j=0;j<5;j++)  
        {  
            Tab[i][j] = -1;  
        }  
    }  
     
    // On réinitialise le compteur de ligne car i;a été incrémenté lors de l'iniatialisation  
    i = 0;  
     
    // On ouvre le fichier en lecture seule et en mode texte  
    m_File = fopen(PATH,"rt" );  
   
    // On vérifie qu'il n'y ai pas eu d'erreur pendant l'ouverture du fichier  
    if(!m_File) return 1;  
   
    // On lit le fichier ligne a ligne et on stocke les valeurs dans un tableau d'entier  
    // La boucle while a l'avantage de permettre la lecture d'un fichier sans connaitre son nombre de ligne exact  
    // et nous évite donc de faire bugger le programme  
    // Le "feof" veut "End Of File". On lit donc jusuqu'à la fin du fichier  
    while(!feof(m_File) && i < 4000)  
    {  
         
        j = 0;  
   
        // On récupere la ligne courante du fichier  
        fgets(szbuff,MAX_CHAR_PER_LINE,m_File);  
         
        // On decoupe la ligne selon le charactere de séparation SEP (" " )  
        token = strtok(szbuff,SEP);  
   
        // On lit les éléments découpés un à un et on les stocke dans le tableau Tab  
        while(token != NULL && j < 5)  
        {  
            // On stocke la valeur lue dans le tableau  
            Tab[i][j] = atof(token);  
            // On lit l'element suivant retourner par strtok  
            token = strtok(NULL,SEP);  
            // On incremente le compteur des ordonnées  
            j++;  
        }  
         
        // On incrémente le compteur des abscisses  
        i++;  
    }  
   
   
    // On affiche le tableau pour etre sur que tout s'est bien passé... Le \t correspond au caractere tabulation  
    // Le 0.2f indique qu'on doit afficher un float avec 2 decimales après la virugle  
    for(int x=0;x<i;x++)  
    {  
        for(int y=0;y<j;y++)  
        {  
            printf("%0.2f\t",Tab[x][y]);  
        }  
        printf("\n" );  
    }  
   
    return 0;  
   
}  
 
 
mais le pgm defile et le compilateur me met ça à la fin :
 
'site.exe': Loaded 'C:\Documents and Settings\lefrancois\Mes documents\C++\site\Debug\site.exe', Symbols loaded.
'site.exe': Loaded 'C:\WINDOWS\SYSTEM32\ntdll.dll', No symbols loaded.
'site.exe': Loaded 'C:\WINDOWS\SYSTEM32\kernel32.dll', No symbols loaded.
The program '[204] site.exe: Native' has exited with code 0 (0x0).
 
 
merci de m'aider, je suis débutant

Reply

Marsh Posté le 07-04-2006 à 22:08:56   

Reply

Marsh Posté le 07-04-2006 à 22:16:42    

D'abord tu mélanges allègrement C et C++, fais un choix.
 
Inutile de faire fopen(..., "rt" ); par défaut c'est du texte, donc "r" suffit.
 
Pourquoi avoir pris 12 caractères par lignes tu oublies éventuellement le retour chariot et le zéro terminal de fin de chaîne.
(la dernière ligne du fichier fait 24 caractères + le retour chariot (peut-être) + le zéro de fin de chaîne)
 
Ensuite la boucle de lecture d'un fichier se fait de cette manière
while (fgets(szbuff,MAX_CHAR_PER_LINE,m_File) && i < 4000)
{
   ..........
}
 
Ensuite il ne faut plus utiliser de puis belle lurette les fonctions ato... mais strtol ou strtod pour les conversions de chaînes vers nombres.
 
Très dangereux le j n'est pas véritablement initialisé, c'est peut-être 5 mais ce n'est pas très "safe" comme programmation !
for(int y=0;y<j;y++)  
 
 
Celà ne résoudra peut-être pas tes problèmes mais déjà on y  verra plus clair.


Message édité par Trap D le 07-04-2006 à 22:23:01
Reply

Marsh Posté le 07-04-2006 à 22:48:28    

boost::tuple

Reply

Marsh Posté le 07-04-2006 à 22:54:48    

#include <fstream>
#include <malloc.h>  
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>  
                               // strtok() -> decoupage de chaine de caracteres  
                               // atoi -> convertir une chaine de caractere en un entier  
   
                   
                   // Nombre de colonne maximum du tableau  
#define MAX_CHAR_PER_LINE    50                // Nombre de caratere maximum par ligne dans le fichier lu : 3*400+400+1 = 1601 mais j'ai mis 1650 pour arrondir  
#define SEP                    " "                    // Séparateur utilisé dans le fichier  
#define PATH                "C:\\MESURE1.txt"        // Mets l'emplacement de ton fichier contenant les valeurs  
   
   
int main(int argc, char* argv[])  
{  
    FILE*    m_File;  
    int        i = 0;  
    int        j;  
    float    Tab[4000][5];  
    char    szbuff[MAX_CHAR_PER_LINE];  
    char*    token;  
   
     
     
    // On initialise le tableau a -1  
    for(i=0;i<4000;i++)  
    {  
        for(j=0;j<5;j++)  
        {  
            Tab[i][j] = -1;  
        }  
    }  
     
    // On réinitialise le compteur de ligne car i;a été incrémenté lors de l'iniatialisation  
    i = 0;  
     
    // On ouvre le fichier en lecture seule et en mode texte  
    m_File = fopen(PATH,"r" );  
   
    // On vérifie qu'il n'y ai pas eu d'erreur pendant l'ouverture du fichier  
    if(!m_File) return 1;  
   
    // On lit le fichier ligne a ligne et on stocke les valeurs dans un tableau d'entier  
    // La boucle while a l'avantage de permettre la lecture d'un fichier sans connaitre son nombre de ligne exact  
    // et nous évite donc de faire bugger le programme  
    // Le "feof" veut "End Of File". On lit donc jusuqu'à la fin du fichier  
    while(!feof(m_File) && i < 4000)  
    {  
         
        j = 0;  
   
        // On récupere la ligne courante du fichier  
        fgets(szbuff,MAX_CHAR_PER_LINE,m_File);  
         
        // On decoupe la ligne selon le charactere de séparation SEP (" " )  
        token = strtok(szbuff,SEP);  
   
        // On lit les éléments découpés un à un et on les stocke dans le tableau Tab  
        while(token != NULL && j < 5)  
        {  
            // On stocke la valeur lue dans le tableau  
            Tab[i][j] = atof(token);  
            // On lit l'element suivant retourner par strtok  
            token = strtok(NULL,SEP);  
            // On incremente le compteur des ordonnées  
            j++;  
        }  
         
        // On incrémente le compteur des abscisses  
        i++;  
    }  
   
   
    // On affiche le tableau pour etre sur que tout s'est bien passé... Le \t correspond au caractere tabulation  
    // Le 0.2f indique qu'on doit afficher un float avec 2 decimales après la virugle  
   
 
 
 for(int x=0;x<i;x++)  
    {  
        for(int y=0;y<j;y++)  
        {  
            printf("%0.2f\t",Tab[x][y]);  
        }  
        printf("\n" );  
    }  
   
    return 0;  
   
}  
 
 
voilà, j'ai changé les deux trois trucs mais je dois laisser la fonction d'impression comme ça
 
le pgm tourne mais la mise en forme n'est pas conservée, et toute defile à toute vitesse à l'écrn sans que ça s'arrete  
 
 
sinon, une structure serait elle plus adaptée
 
 
 
 
 
#include<string.h>      /* declaration des bibliotheques*/  
#include<stdio.h>      /* declaration des bibliotheques*/
#include<stdarg.h>      /* declaration des bibliotheques*/  
#include<stdlib.h>      /* declaration des bibliotheques*/
#include<conio.h>
 
 
struct Personne          /*declaration de la structure*/
{
 float HEUREA;          /*declaration*/
 float XA;          /*declaration*/
 float YA;       /*declaration*/
 float ZA;        /*declaration*/
 
};  
 
 
 
 
 
 
void main ()
{
 int date[3],i,j;                    /*declaration des variabled*/
 char NOM[10],INDIRECTION[30]={"c:\\"},REINDIRECTION[30]={"c:\\"};   /*declaration des variabled et chemin d'acces*/
 FILE*FICHIER;                     /*declaration des variabled*/                    
 struct Personne per[20000];                  /*declaration des variabled*/
 char ligne[3000];                     /*declaration des variabled*/
 
 
 
 printf("\nNous allons saisir les 3 composantes de la date (jour,mois,annee)\n" );  
 
 printf("\npreparez vous à saisir\n" );     /*affichage de message*/
 printf("nombre saisi :   " );        /*affichage de message*/
 scanf("%d",&date[0]);          /*saisie*/
                   
          /*saisie*/
 
 
 printf("\n**    Nous allons lire dans le fichier de stockage   **    \n" );  /*affichage de message*/  
 printf("        lecture et enregistrement .......\n\n\n\n" );     /*affichage de message*/
 
 
 
 printf("\nQuel est le nom du fichier d'entrer en .txt?\n" );   /*fichier de entrer*/
 gets(NOM);               /*acquisition*/
 gets(NOM);  /*acquisition*/
 strcat(INDIRECTION,NOM);                                      /*concatenation*/  
 
 if ((FICHIER = fopen(INDIRECTION,"r" ))== NULL)            /*condition*/               /*test de validite d'ouverture*/  
 {
  printf("Impossible d'ouvrir le fichier %s",NOM);          /*affichage message*/
  return;
 }  
 
 
 
 i = 0;              /*acquisition des parametres du fichier source a l'aide d'une boucle while jusqu'au end of file*/
 while (fscanf(FICHIER, "%d\t%d\t%d\t%d\n",  
 &per[i].HEUREA, per[i].XA, per[i].YA,per[i].ZA) != EOF)
  i++;
 
 
 printf("\n\n*****Voici le tableau final ******\n\n" ); /*affichage du tableau des deux nouvelles personnes*/
 for (j= 0; j < i; j++)  
  printf( "%d\t%d\t%d\t%d\n",  
 &per[i].HEUREA, per[i].XA, per[i].YA,per[i].ZA);  
 fclose(FICHIER);  
 
 
 
 
 
 
 
 
 
 
 printf("\n\n\n*************************************" );   /*affichage du message de fin de programmme*/
 printf("\nle programme est maientenant termine\n" );    /*affichage du message de fin du programme*/
 printf("\nAU REVOIR ET BONNE JOURNEE " );      /*affichage du message de fin de programmme*/
 printf("\n*************************************\n\n\n\n\n" ); /*affichage du message de fin de programmme*/
 
}

Reply

Marsh Posté le 07-04-2006 à 23:43:39    

balises [code] !

Reply

Marsh Posté le 08-04-2006 à 01:59:25    

Aux entêtes inutilisées près, c'est du C pur et dur. Je vote pour un déplacement en cat C ...

Reply

Marsh Posté le 08-04-2006 à 02:20:14    

mais qu'est ce qu'ils ont tous ces gens à ne pas utiliser la balise code, je sais pas pour vous mais moi franchement ça me dérange énormement, surtout quand le code est assez long


---------------
http://www.blastmanu.info
Reply

Marsh Posté le 08-04-2006 à 09:43:34    

moi, ça ne me dérange absolument pas. Quand le code est trop long, et que le PO n'a pas fait l'effort de donner le code minimum compilable qui illustre son problème, il est hors de question que je fasse l'effort de le lire.
 
Après, entre un code court sans balises, et avec balises, je préfère avec :)

Reply

Marsh Posté le 08-04-2006 à 10:02:17    

PO :??:

Reply

Marsh Posté le 08-04-2006 à 11:28:17    

Posteur Original

Reply

Marsh Posté le 08-04-2006 à 11:28:17   

Reply

Marsh Posté le 08-04-2006 à 11:33:38    

:jap:

Reply

Marsh Posté le 08-04-2006 à 12:13:08    

blastman a écrit :

mais qu'est ce qu'ils ont tous ces gens à ne pas utiliser la balise code, je sais pas pour vous mais moi franchement ça me dérange énormement, surtout quand le code est assez long


Tous le monde n'est pas un habitué des forums de programmation et n'est pas forcement au courant qu'une telle balise existe!

Reply

Marsh Posté le 08-04-2006 à 12:15:13    

c'est pour ça qu'il y a un topic épinglé judicieusement intitulé Règles du forum Programmation, dans lequel on peut facilement lire Pour poster du code, il existe des balises C/C++ bien pratiques

Reply

Marsh Posté le 08-04-2006 à 12:41:49    

justement, je ne sais pas ce qu'est une balise donc excusez moi pour ce long pgm mais je fais du C++ que depuis 2 mois donc ...
 
sinon, personne n'a fait tourner ce pgm sur sa mchine pour voir si ça marche, car je suis vrt bloqués
 
je privilégir la structure

Reply

Marsh Posté le 08-04-2006 à 12:54:33    

keep_school a écrit :

justement, je ne sais pas ce qu'est une balise donc excusez moi pour ce long pgm mais je fais du C++ que depuis 2 mois donc ...


 
je te rassure : tu ne fais pas du c++  [:catharsis]  
 
1) Quand on voit des "#include <malloc.h>" , des "char*" ou des "printf", c'est clairement pas du C++ mais du C => mauvaise cat, t'as pas lu la charte
 
2) ton titre est CAPS : t'as pas lu la charte
 
3) pas de balises de code : t'as pas lu la charte
 
Conclusion : ça mérite un BAN :o

Reply

Marsh Posté le 08-04-2006 à 12:57:55    

c'est sur que si tu  fais pas d'effort pour les forumeurs, aucun forumeur n'en fera :o

Reply

Marsh Posté le 09-04-2006 à 11:55:40    

smaragdus a écrit :

je te rassure : tu ne fais pas du c++  [:catharsis]


C'est clair : il fait du C sur VS .NET  :jap:


Message édité par slash33 le 09-04-2006 à 11:56:06
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed