Erreur compilation génerateur c++

Résolu/Fermé
Utilisateur anonyme - 9 sept. 2010 à 22:36
 Utilisateur anonyme - 28 sept. 2010 à 21:50
Bonsoir,

J'ai voulu faire un projet personnel de génerateur de lignes (que l'utilisateur entre avec le clavier). Je suis encore un grand débutant, j'utilise Visual C++ 2008 Express, j'ai écrit ce code :
#include <stdio.h>
#include <stdlib.h>
int main()
{
char choix[80] = {0}; long ch1 = 0, ch2 = 1;
FILE* fichier = NULL;
fichier = ("C:\\GENERATOR.txt");
printf("\t CE PROGRAMME VOUS PERMET DE GENERER TOUT TYPE DE PHRASE REPETEE\n\n");
printf("Entrez la phrase : ");
scanf("%s", choix);
printf("\nEntrez le nombre de repetitions : ");
scanf("%d", &ch1);
printf("Patientez SVP\n");
while (ch2 <= ch1) {
fprintf(fichier, "%s\n", choix);
ch2++; }
system("PAUSE");
return 0;
}

le programme se compile tranquillement, et quand j'entre le nombre de répetitions, un message d'erreur apparait : Exception non gérée ... Violation d'accés à l'écriture de l'emplacement 0x.... sachant que j'ai pas dépassé 80 caractères et pas d'espace
je soupçonne à un dépassement de tampon, mais comment faire pour se résoudre . Aidez-moi SVP !!!
A voir également:

7 réponses

Bonjour,
Tu fais un fprintf sans fopen/fclose ?
C'est curieux, non ?

Cordialement, M.
2
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
10 sept. 2010 à 11:33
bien vu. Il fait même une affectation étrange sur "fichier" de type FILE* !!
0
Utilisateur anonyme
28 sept. 2010 à 21:50
merci prb résolu
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 660
10 sept. 2010 à 00:01
essaye de remplacer

scanf("%d", &ch1);
par
scanf("%l", &ch1);

puisque tu as déclaré ch1 comme un long et non un int.
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 660
Modifié par Pacorabanix le 10/09/2010 à 02:04
PS : tu as écrit que c'est une erreur de compilation, mais justement ce n'en est pas une, c'est une erreur à l'exécution.
0
Utilisateur anonyme
28 sept. 2010 à 21:50
merci pacora. prb résolu !
0
Utilisateur anonyme
22 sept. 2010 à 21:56
pour le fclose, j'ai essayé, le prb persiste. Mais merci quand meme.

%l ? à quoi ça sert ?
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 660
Modifié par Pacorabanix le 22/09/2010 à 23:11
donc le fopen, c'est obligatoire (et le fclose il faut le mettre aussi) ça c'est sûr.

pour le % , c'est pour préciser le type de données que tu mets. %d pour un entier (type "int") et %ld ou %l je ne sais plus bien pour un entier long (puisque ch1 est de type "long"=="long int")


mais sinon concernant le problème des fichiers,

En essayant de compiler ton code j'obtiens un Warning (avertissement) :

G:\Prog\C\test\main.c [Warning] assignment from incompatible pointer type

concernant la ligne :
fichier = ("C:\\GENERATOR.txt");


comme a dit Char Sniper, ça n'a pas de sens. Le compilateur peut quand même faire son travail, mais ce genre de ligne ne veut pas dire grand chose.
fichier est de type FILE* et tu lui assignes une chaine de caractères (plus ou moins un char*) !

alors forcément quand fprintf() est appelée, il y a un problème impossible à résoudre pour le programme, qui s'attend à avoir un FILE* dans fichier, or c'est une chaine de caractère, et donc le programme ne comprend pas ce qu'il se passe. fprintf tente d'interpréter ça comme quelque chose qui n'a rien à voir, ça ne veut rien dire ---> plantage de l'application.


tu dois utiliser correctement fopen :

fichier = fopen("C:\\GENERATOR.txt", "w");

serait déjà mieux.

C'est ce que tu as fait ?
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 660
Modifié par Pacorabanix le 22/09/2010 à 23:31
PS : je viens de vérifier, tu peux très bien laisser les %d, il n'y a pas de souci si tes nombres sont petits (mieux vaut déclarer ch1 et ch2 comme des "int" néanmoins, pas de raison que ce soient des "long", sauf si tu veut remplir ton disque dur avec ton fichier GENERATOR.txt ;) )

c'est bien un problème de fopen() !
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 660
Modifié par Pacorabanix le 22/09/2010 à 23:32
par contre il y a encore un problème.

Le problème est que scanf("%s", choix) ne va pas enregistrer la phrase complète. Dès que tu mets un espace il ne prendra que le premier mot dans "choix".

Ensuite, le second "mot" que tu auras mis dans ta phrase sera utilisé pour répondre à la question "entrez le nombre de répétition" et évidemment, ça causera un problème. Tu n'auras même pas le temps de donner toi-même un nombre de répétitions et le programme s'arretera ou fera un bug etc....

voir : http://www.siteduzero.com/tutoriel-3-35363-realiser-des-saisies-securisees-grace-a-fgets.html
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 660
22 sept. 2010 à 23:34
0
Utilisateur anonyme
28 sept. 2010 à 21:49
merci. prb résolu
0
overcode Messages postés 119 Date d'inscription jeudi 6 décembre 2007 Statut Membre Dernière intervention 21 octobre 2011 27
22 sept. 2010 à 23:36
Si je m'en tiens à l'intitulé de ton message, ce serait du C++, mais je vois là que c'est du C.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
28 sept. 2010 à 21:10
j'ai entré fopen et fclose comme vous disez mais le prb persiste toujours voici mon nouveau code :
#include <stdio.h>
#include <stdlib.h>
int main()
{
char choix[80] = {0}; long ch1 = 0, ch2 = 1;
FILE* fichier = NULL;
fichier = fopen("C:\\GENERATOR.txt", "r+");
printf("\t CE PROGRAMME VOUS PERMET DE GENERER TOUT TYPE DE PHRASE REPETEE\n\n");
printf("Entrez la phrase : ");
scanf("%s", choix);
printf("\nEntrez le nombre de repetitions : ");
scanf("%d", &ch1);
printf("Patientez SVP\n");
while (ch2 <= ch1) {
fprintf(fichier, "%s\n", choix);
ch2++; }
fclose(fichier);//fermeture du fichier
system("PAUSE");
return 0;
}
//////////////////////////////////////////

toujours le meme phénomene, quand j'entre "ch1", j'ai meme changé scanf par fgets mais voici le résultat :
Program received signal SIGSEGV, Segmentation fault, do you want to view the backtrace. Et le programme se bloque !! que faire !
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 660
28 sept. 2010 à 21:27
d'une part il faudrait mieux ouvrir ton fichier comme ceci
fichier = fopen("C:\\GENERATOR.txt", "w"); 


puisque tu ne fais qu'écrire dedans.

Ensuite teste de cette manière :

est-ce que le problème persiste lorsque tu rentres "0" pour ch1 ?

et lorsque tu rentres un seul mot (Sans espace ni signe de ponctuation) ?

parceque moi j'ai fais le même code avec "w" à la place de "r+" et ça marche (Avec un seul mot)
0
Utilisateur anonyme
28 sept. 2010 à 21:11
mais merci quand meme
0
Utilisateur anonyme
28 sept. 2010 à 21:13
MERCI A VOUS TOUS ! PRB RESOLU ... il fallut remplacer "r+" par "w" c'est ce que j'ai raté.

MERCI INFINIMENT !

A +
0