PB ACQSUISITION EN C++, SI UN CRACK EN INFO PEUT ME FAIRE TOURNER CE - C++ - Programmation
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.
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*/
}
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 ...
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
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
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!
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
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
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++
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
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
Marsh Posté le 09-04-2006 à 11:55:40
smaragdus a écrit : je te rassure : tu ne fais pas du c++ |
C'est clair : il fait du C sur VS .NET
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