Accueil > Forum > > > > lecture de fichiers (commence bien mais le programme s'arrete)
lecture de fichiers (commence bien mais le programme s'arrete)
mercredi 13 octobre 2010 à 23:35:52 |
lecture de fichiers (commence bien mais le programme s'arrete)

vercd7am
|
Bonjour, j'ai un probleme avec le programme suivant; je veux lire deux fichiers, l'un contient une colonne de nombres, l'autre des coordonnees: je lis autant de coordonnees que le nombre marque dans le premier fichier, par groupes de trois nombres. Mon programme commence bien, lit bien, mais finit toujours par me renvoyer le message que mon programme a arrete de fonctionner et je ne comprends pas pourquoi.
Code C/C++ :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "structure.h"
int main()
{
char nom1[]="C:\\FichierNombre.txt";
// fichiers contenant le nombre de points a l'interieur de la fenetre erodee
char nom2[]="C:\\FichierCoordonnees.txt";
// fichiers contenant les coordonnees des points
float R=0;
int C1, C2;
FILE* fichier = NULL;
fichier = fopen(nom1,"r");
if(fichier != NULL)
{
FILE* fichier2 = NULL;
fichier2 = fopen(nom2,"r");
if(fichier2!= NULL)
{
int N1, N2, N3;
for(C1=1; C1<2; C1++)
{
fscanf(fichier, "%d %d %d", &N1, &N2, &N3); //N1 nombre dans la fenetre erodee, N2 ceux aux bords de la fenetre erodee et a l interieur, N3 ceux a l exterieur
printf("%d %d %d \n\n", N1, N2, N3); // N1 + N3 = nombre total de points dans le processus
struct coordonnees* points1; // je cree un pointeur sur ma structure processus pour les points dans la fenetre erodee
points1 = (struct coordonnees*)malloc(N1* sizeof(*points1));
struct coordonnees* points2; // je cree un pointeur sur ma structure processus pour les points au bord
points2 = (struct coordonnees*)malloc(N2* sizeof(*points2));
struct coordonnees* points3; // je cree un pointeur sur ma structure processus pour les points a l exterieur
points3 = (struct coordonnees*)malloc(N3* sizeof(*points3));
int u,v,w;
// partie correspondant a la fenetre erodee
for(u=0;u<N1+1;u++)
{
fscanf(fichier2,"%lf %lf", &points1[u].x, &points1[u].y);
printf("x: %f, y:%f\n", points1[u].x, points1[u].y);
}
// partie correspondant au bord de la fenetre erodee
for(v=0;v<N2+1;v++)
{
fscanf(fichier2,"%lf %lf", &points2[v].x, &points2[v].y);
printf("x: %f, y:%f\n", points2[v].x, points2[v].y);
}
// partie correspondant a l exterieur de la fenetre erodee
for(w=0;w<N3+1;w++)
{
fscanf(fichier2,"%lf %lf", &points3[w].x, &points3[w].y);
printf("x: %f, y:%f\n", points3[w].x, points3[w].y);
}
}
}
else{printf("big problem2");}
fclose(fichier2);
}
else
{
printf("big problem\n");
}
fclose(fichier);
return 0;
}
le fichier structure.h est le suivant (super basique)
Code C/C++ : struct coordonnees
{
double x;
double y;
};
R et C2 ne servent pour l'instant a rien mais c'est normal
C1 ne prend que la valeur 1 car c'est juste un test
Pour voir, j'ai essaye de mettre en commentaire ma boucle for pour N2, et celle pour N3, defois il fonctionne sans probleme, defois il fonctionne mais me renvoie egalement le message d'arret, idem quand je met la boucle for avec N3 en commentaire et que je remplace N2 par un nombre(toujours plus petit que la valeur de N2 sinon il y aurait un probleme vu la taille de points2), defois ca passe, defois ca renvoie l'erreur.
La je cale, je ne comprends vraiment pas pourquoi. Quelqu'un pourrait-il m'aider? Merci d'avance.
|
|
jeudi 14 octobre 2010 à 09:52:05 |
Re : lecture de fichiers (commence bien mais le programme s'arrete)

louis14
|
Bonjour,
Est-ce que tu peux lancer ton programme en mode debug. Et dans ce cas tu suis pas pas ton programme et tu verras ce qui ne va pas.
tu peux aussi ajouter le nombre d'éléments retournés far fscanf afin de vérifir si les données sont bien lues : int ret = fscan... et tu affiches cette valeur aussi.
Bon debuguage.
louis
|
|
jeudi 14 octobre 2010 à 10:24:16 |
Re : lecture de fichiers (commence bien mais le programme s'arrete)

vercd7am
|
ben justement, le debug dis que tout va bien
Building to ensure sources are up-to-date
Build succeeded
Selecting target:
Debug
Adding source dir: C:\Users\alicek\Desktop\Didier\NP\
Adding source dir: C:\Users\alicek\Desktop\Didier\NP\
Adding file: bin\Debug\NP.exe
Starting debugger:
done
Registered new type: wxString
Registered new type: STL String
Registered new type: STL Vector
Setting breakpoints
Debugger name and version: GNU gdb 6.8
Child process PID: 5156
Program exited normally.
Debugger finished with status 0
|
|
jeudi 14 octobre 2010 à 10:44:59 |
Re : lecture de fichiers (commence bien mais le programme s'arrete)

CptPingu
|
Le "+ 1" que tu mets dans tes boucles fait que tu dépasses la taille de tes tableaux :)
Petites remarques:
- Utilise un compilateur C, et pas un compilo C++ si tu fais du C ! Ça se voit (je parie que tu utilises Dev-C++). En C, il est inutile de caster le retour du malloc, par exemple.
- Découpe ton code en petite fonction. Diviser un gros problème difficile en plein de petits problèmes faciles, est la clé du succès.
- louis14 à fait une remarque judicieuse: tester le retour de fscanf (je ne le fais pas dans mon exemple ci-dessous, mais il faudrait).
- Ne pas oublier de libérer les ressources allouées, via free().
J'ai appliqué ce que je t'ai dit sur ton code:
Code C/C++ :
#include <stdio.h>
#include <stdlib.h>
struct coordonnees
{
double x;
double y;
};
void getSize(const char* filename, int* size1, int* size2, int* size3)
{
FILE* file = fopen(filename,"r");
if (file == NULL)
{
printf("big problem\n");
return;
}
/* Plus besoin de & devant size1, size2 et size3, car ce sont des pointeurs, le "&" a déjà été précisé avant */
fscanf(file, "%d %d %d", size1, size2, size3);
fclose(file);
}
struct coordonnees* readCoords(FILE* file, int size)
{
int i = 0;
struct coordonnees* points;
points = malloc(size * sizeof(struct coordonnees));
for(i = 0; i < size; ++i)
{
fscanf(file,"%lf %lf", &points[i].x, &points[i].y);
printf("x: %f, y:%f\n", points[i].x, points[i].y);
}
return points;
}
void readAllCoords(const char* filename, int size1, int size2, int size3)
{
FILE* file = fopen(filename,"r");
struct coordonnees* points1;
struct coordonnees* points2;
struct coordonnees* points3;
if (file == NULL)
{
printf("big problem 2\n");
return;
}
points1 = readCoords(file, size1);
points2 = readCoords(file, size2);
points3 = readCoords(file, size3);
free(points1);
free(points2);
free(points3);
fclose(file);
}
int main()
{
int C1;
int n1, n2, n3;
getSize("FichierNombre.txt", &n1, &n2, &n3);
printf("Taille: %d %d %d \n\n", n1, n2, n3);
for(C1 = 1; C1 < 2; ++C1)
readAllCoords("FichierCoordonnees.txt", n1, n2, n3);
return 0;
}
________________________________________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
Merci d'utiliser Réponse acceptée si un post répond à votre question
|
|
jeudi 14 octobre 2010 à 10:51:55 |
Re : lecture de fichiers (commence bien mais le programme s'arrete)

CptPingu
|
D'ailleurs, en petit exercices, je te propose d'améliorer ce que j'ai fait.
Dans la fonction readCoord, j'ai fait un truc pas terrible: je n'ai pas séparé la lecture et l'affichage.
Fait donc une fonction "displayCoords" qui se charge d'afficher le contenu d'un tableau de coord, et appelle là dans "readAllCoords". Tu pourras ensuite retirer l'affichage dans readCoord, qui n'a rien à faire là.
________________________________________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
Merci d'utiliser Réponse acceptée si un post répond à votre question
|
|
jeudi 14 octobre 2010 à 12:00:02 |
Re : lecture de fichiers (commence bien mais le programme s'arrete)

vercd7am
|
Merci, le +1 etait visiblement bien le probleme, entre temps je m'etais rendu compte que j'avais oublie le free. Merci aussi pour le code supplementaire.
J'utilise code blocks en mode console mais bien pour du C, mais je suis debutant, pointer n'est pas encore super evident et les fonction qui vont avec de meme.
J'aurais encore aime savoir quelquechose. Si j'ai reecris le programme, c'est parce qu'au depart j'utilisais non pas deux fichiers mais beaucoup plus, 100*177=17 700 que j'ecrivais avec un autre programme. Je l'ai reecris pour mettre tous les fichiers les uns a la suite des autres. Est-ce que cette nouvelle solution est plus rapide, beaucoup plus rapide, ou bien que cela ne change rien?
Par ailleurs, la suite du programme continue sur du calcul de distance entre les points dont les coordonnees sont dans les fichiers. Au total j'ai toujours environ 1000 points par configuration, 100 configurations, et je dois calculer le nombre de triplets a,b,c plus proche qu'une certaine longueur (d(a,b)<r, d(a,c)<r, d(b,c)<r pour r variant de 0 a 0,24 par 0,01). C'est super demandant pour le processeur, j'en gagne un peu en mettant un certain nombre de if pour n'avoir a calculer que le minimum de distances entre points, mais ca reste enorme (1000^3 c'est gros). Est-ce que pour ce type de calcul, je peux gagner enormement en temps avec un code en assembleur?
|
|
jeudi 14 octobre 2010 à 12:01:33 |
Re : lecture de fichiers (commence bien mais le programme s'arrete)

vercd7am
|
Je vais tenter l'exercice, sans doute ce soir. J'espere me montrer a la hauteur.
|
|
jeudi 14 octobre 2010 à 13:42:48 |
Re : lecture de fichiers (commence bien mais le programme s'arrete)

CptPingu
|
J'utilise code blocks en mode console mais bien pour du C, mais je suis debutant, pointer n'est pas encore super evident et les fonction qui vont avec de meme.
Code::Block a un compilateur de C++, il me semble (je me demande si on ne peut pas lui spécifier dans les options d'utiliser un compilateur C).
Est-ce que cette nouvelle solution est plus rapide, beaucoup plus rapide, ou bien que cela ne change rien?
La solution présentée est juste une réécriture un peu plus élégante, elle ne change strictement rien en terme de performance. En revanche, je pense qu'elle est plus lisible et donc plus maintenable. D'une manière générale, une fonction ne devrait pas dépasser une trentaine de ligne.
Si j'ai reecris le programme, c'est parce qu'au depart j'utilisais non pas deux fichiers mais beaucoup plus, 100*177=17 700 que j'ecrivais avec un autre programme. Je l'ai reecris pour mettre tous les fichiers les uns a la suite des autres.
Là, y a peut être un problème de conception. Comment peux-tu avoir 17 700 fichiers à lire ? Si je peux avoir le contexte, je peux peut être te donner une meilleur approche. Parce qu'ouvrir et fermer 17 700 fois des fichiers, ça coute cher !
Par ailleurs, la suite du programme continue sur du calcul de distance entre les points dont les coordonnees sont dans les fichiers. Au total j'ai toujours environ 1000 points par configuration, 100 configurations, et je dois calculer le nombre de triplets a,b,c plus proche qu'une certaine longueur (d(a,b)<r, d(a,c)<r, d(b,c)<r pour r variant de 0 a 0,24 par 0,01). C'est super demandant pour le processeur, j'en gagne un peu en mettant un certain nombre de if pour n'avoir a calculer que le minimum de distances entre points, mais ca reste enorme (1000^3 c'est gros). Est-ce que pour ce type de calcul, je peux gagner enormement en temps avec un code en assembleur?
Passer en assembleur ne te fera pas forcément gagner en perf, surtout si ton assembleur n'est pas terrible.
La meilleur chose à faire est de faire un algorithme performant, et de voir si ton code C est correctement optimisé. Jouer avec les options du compilateur peut pas mal aidé aussi.
Si tu dois lire souvent des fichiers, je te conseille de les mapper en mémoire, via mmap (sous Unix) et via GetMapViewOfFile (ça doit être à peu près le nom sous Windows).
L'utilisation d'outils de calcul de performance aide aussi beaucoup à détecter les points de ralentissements (callgrind sous Unix, et sous Windows, ben, heu... Je ne sais pas, mais ça doit exister :p).
________________________________________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
Merci d'utiliser Réponse acceptée si un post répond à votre question
|
|
Cette discussion est classée dans : fichier, coordonnees, n2, n3, points2
Répondre à ce message
Sujets en rapport avec ce message
[PBM]Addition de nombres aléatoirs [ par Stoofleouf ]
Bonjour, je débute en C++ et j'ai un souci :Je veux pouvoir générer une serie de nombre aléatoire tout en parametrant au préalable la somme des nombre
Sauvegarder des coordonnees dans un fichier ascii [ par fred100582 ]
Salut, je voudrais sauvegarder la position d'objet (dans une fenetre opengl) et donc ses coordonnees dans un fichier ascii, qq'un peut-il m'aider car
ca plante et sa m'enerve [ par nach73 ]
Bonjour je suis debutant j'essaie de copier un fichier source dans un fichier destinataire par des fonctions ci dessous.Mais seulement il me creer bie
syntaxe pour compilation conditionnelle ? [ par tintin72 ]
Bonjour, Je voudrais savoir quel est la syntaxe exacte lorsqu'on veut éviter les inclusions multiple de fichier. J'ai en effet vu plusieurs version. e
convertir un fichier .wav en fichier .mp3 [ par hacker_mt ]
bonjour je souhaiterais savoir comment faire pour convertir un fichier .wav en fichier .mp3 merci d'avance
Remplacement mot dans un fichier [ par nach73 ]
voila je me casse la tete pour creer un prog qui me permetde changer un mot qui se trouve dans un fichier par un autre.Evidement qui me change tout le
Manipulation de fichier en lecture en C++ sur VB [ par cali1983 ]
Recherche aide pour manipulation de fichier en C++ sur Visual Basic <TD vAlign=to
suprimer un fichier [ par anubis52100 ]
bonjour voila j'ai dans un fichier texte des caractère je souhaiterai effacer ces caractèreou sinon je soouhaiterai effacer le fichier du disque dur.m
fread & fwrite [ par nach73 ]
Salut, je voudrais utilisé fread et fwrite, mais lire des parties du fichier et ecrire cette partie dans un autre fichier.Mais je ne comprend pas tout
Regénérer un fichier ODL [ par Radium The Hammer ]
Bonjour je suis actuellement en stage et comme je débute en visual studio j'ai une petite question à vous poser: je dois continuer un code pré-éxistan
Livres en rapport
|
Derniers Blogs
POUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDNPOUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDN par neodante
Quelle est le point commun entre : Microsoft il y a 10 ans et Apple aujourd'hui ? Réponse: avoir une politique de protocoles propriétaires et fermés :) Car pour rappel (si si je vous assure c'est important de le rappeler), la majorité des spécifications e...
Cliquez pour lire la suite de l'article par neodante JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc
Forum
MATLAB PROGRAMME MATLAB PROGRAMME par wahab1087
Cliquez pour lire la suite par wahab1087 RGB2GRAYRGB2GRAY par musa18
Cliquez pour lire la suite par musa18
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|