Lectur/ecriture dans un fichier: Probleme!

Résolu/Fermé
MouchT8 Messages postés 22 Date d'inscription samedi 24 mai 2008 Statut Membre Dernière intervention 11 août 2008 - 29 mai 2008 à 16:56
 SebDam - 5 août 2008 à 15:36
Bonjour,

VOILA! je ne sais pas par ou commencer tellement j'ai de probemes dans mon programme.
C'est la premiere fois dans mes devoirs que je travail là dessus.

Je vais commencer par mon probleme principale.
Voila je dois ouvrir un fichier en lecture,
donc avec fopen,
Mais VS me rend dingue..

j'ai:

//FONCTION PRINCIPALE main()

FILE * f;
FILE *fopen(const char *path,const char *mode);
int fclose (FILE *stream); 

int main(void) {
char mot_texte[LONGMOT];	//mot lu dans le fichier texte
char dico[MAXMOTS][LONGMOT];
char *pmot;
char **argv;	//valeur des arguments
int argc;		//nombre d'argument

int strcmp (const char *s1, const char *s2);
void qsort (void *base, size_t nmemb, size_t size,int (*compar)(const void *, const void *));


int i,j,k;
char mot[100];
short nb_mots;



printf("Veuillez entrer le nom du fichier texte a traiter pour la recherche dichotomique svp: ");
fscanf_s(f,"%s",&argv);

f=fopen("dico.dat","r");

[...]


Le probleme le voila...

VS me note: " warning C4273: 'fopen' : liaison DLL incohérente" et "warning C4273: 'fclose' : liaison DLL incohérente"

au niveau ce ces 2 lignes :
FILE * f;
FILE *fopen(const char *path,const char *mode);

Pour ce qui est du moment ou j'ouvre dico.dat,
Il me met:
"warning C4996: 'fopen' a été déclaré désapprouvé" et me dit de mettre a la place de fopen, "fopen_s"
seulement si je met fopen_s,il me note ensuite que la fonction ne prend pas 2 arguments -_-

Quelqu'un peut m'aider? si c'est assez clair dans mes explications bien sur :s
A voir également:

31 réponses

mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
16 juin 2008 à 17:24
tu te trompe normalement on definit les fonction a l'exterieur du main c'est seulement leur appel qui est ds le main donc faut que tu sorte tes fonctions du main et dans ta boucle for tu mets les appels a ces deux fonctions
sup_ponc(mot_texte);
sup_maj(mot_texte);
ensuite pour la deuxieme erreur ton appel a dichotomie n'est pas bon ça serait pluto
dichotomie(dico,mot,nb_mots);
0
oui voila j'ai résolu le probleme toute seule avant de recevoir la réponse ici ^^
Mais il me reste juste 1 erreur:

Erreur 1 error C2664: 'dichotomie' : impossible de convertir le paramètre 1 de 'char [100][20]' en 'char


Mon code ressemble à ça maintenant:

#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<stdlib.h>


#define MAXMOTS 100	//nombre maximum de mots dans le dictionnaire
#define LONGMOT 20 	//longueur en carcatere d'un mot


//initialisation de la fonction de recherche dichotomique
short dichotomie(char **dico,char *mot,short nb_mots){


int i,j,k,trouve,indice;		//i->debut, j->fin
int strcmp (const char *s1, const char *s2);


i=0;
j=nb_mots;
trouve=0;

while(i<=j && trouve == 0) {				
	
int moy;		//moyenne de(i,j)
moy=(i+j)/2;
k=moy;


if(strcmp(dico[k],mot)==0) {
	trouve=1;
}
if(strcmp(dico[k],mot)>0) {
	j=k-1;}
else{
	i=k+1;
}
}



if(trouve==0){indice=0;}	//si mot n'a pas été trouvé
if(trouve==1){indice=1;}	//si mot a été trouvé

return indice;
}

//initialisation des fonction de supression des majuscules et de la ponctuation
void sup_ponc(char *pmot){
				
int i=0,j=0;
char c;
				
//Traitement
while (pmot[i]!=NULL){
c=pmot[i];
if (isalpha(c)){
pmot[j]=c;
j++;
}
i++;
}
pmot[j]=0;
}


void sup_maj(char *pmot){
				
int i=0;
char c;

//Traitement
while (pmot[i]!=NULL){
c=pmot[i];
if (isupper(c))
c=tolower(c);
pmot[i]=c;
i++;
}
pmot[i]=0;
}





//FONCTION PRINCIPALE main()



int main (int argc, char **argv) {

FILE * f;

char mot_texte[LONGMOT];	//mot lu dans le fichier texte
char dico[MAXMOTS][LONGMOT];
char *pmot;
char *fichier_texte; //nom du fichier à ouvrir et traiter

void qsort (void *base, size_t nmemb, size_t size,int (*compare)(const char *, const char*));
int strcmp (const char *s1, const char *s2);

int i,j,k;
char mot[100];
short nb_mots;



printf("Veuillez entrer le nom du fichier texte a traiter pour la recherche dichotomique svp: ");
fgets (fichier_texte, sizeof fichier_texte, stdin); 

f=fopen("dico.dat","r");


//lecture mot par mot de tout le fichier et stockage dans un tableau en mémoire (dico)
i=0;
while(fgetc(f)!=EOF)
{
	fgets(dico[i],19,f);
	i++;
}



fclose(f);

//tri en mémoire du tableau dico
qsort((char**)dico,nb_mots,LONGMOT,strcmp);	


//ouverture du fichier texte en lecture
f=fopen ("argv","r");

pmot=mot;

//TRAITEMENT POUR CHAQUE MOT DU TEXTE: suppression de majuscule et de ponctuation
for (i=0; i<nb_mots;i++){
sup_ponc(pmot);
sup_maj(pmot);

}

//recherche du mot dans le tableau dico à l'aide de la fonction dichotomie
dichotomie(dico,mot,nb_mots);

if (dichotomie==0){
char rep;	//variable pourla réponse de l'utilisateur
fprintf (f,"Le mot n'existe pas. Voulez vous l'ajouter au dictionnaire? \n");
fscanf(f,"%s",&rep);

if (rep=='oui') {
strcpy_s(dico[i],mot);		//Ajout du mot dans le dico
qsort ((char**) dico, nb_mots,LONGMOT, strcmp);		// Tri en mémoire, une nouvelle fois, du tableau dico
}
}

fclose(f);

f=fopen("dico.dat","a");

for (i=0; i<MAXMOTS; i++) {
fputs(dico[i],f);
}

fclose(f);

}
0
mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
16 juin 2008 à 17:47
a quelle ligne il te donne cette erreur ?
0
ligne 144

quand j'appel la fonction dans le "main".
0

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

Posez votre question
mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
16 juin 2008 à 18:21
et la ligne 114 c'est quel ligne ? ;)
0
sup_maj(pmot);

}

//recherche du mot dans le tableau dico à l'aide de la fonction dichotomie
dichotomie(dico,mot,nb_mots);


iciiii !!
lol
dans le main ^^
0
mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
16 juin 2008 à 18:25
ok c'est bizarre ton appel ma l'air bon...
dans la declaration de fonction essaye de remplacer dans les parametre char **dico par char dico[MAXMOT][LONGMOT]
0
eh ben figurez vous que c'est ce que j'ai fait juste avant mais là,
il m'apparait alors 3 erreurs et 5 avertissement !!! -_-

les erreurs n'indiquent aucune ligne précise et je ne comprend pas !!

Erreur 6 error LNK2019: symbole externe non résolu "void __cdecl qsort(void *,unsigned int,unsigned int,int (__cdecl*)(char const *,char const *))" (?qsort@@YAXPAXIIP6AHPBD1@Z@Z) référencé dans la fonction _main dv8.obj


Erreur 7 error LNK2019: symbole externe non résolu _WinMain@16 référencé dans la fonction ___tmainCRTStartup MSVCRTD.lib


Erreur 8 fatal error LNK1120: 2 externes non résolus C:\Documents and Settings\LaMoucheTouteCrad\Mes documents\Visual Studio 2005\Projects\devoir 8\Debug\devoir 8.exe


???????????????????

Je n'avais plus qu'une erreur et je me retrouve avec 3 maintenant !!!

et 5 avertissements pas plus explicatifs....


Avertissement 1 warning C4101: 'mot_texte' : variable locale non référencée -> ligne 95

Avertissement 2 warning C4101: 'k' : variable locale non référencée -> ligne 103

Avertissement 3 warning C4101: 'j' : variable locale non référencée -> ligne 103

Avertissement 4 warning C4700: variable locale 'fichier_texte' non initialisée utilisée -> ligne 110

Avertissement 5 warning C4700: variable locale 'nb_mots' non initialisée utilisée -> ligne 128


Mouahahahah je ne m'en sortirais dont jamais ><

Voila pourquoi je me demande si l'erreur résolue ainsi n'st pas plus complicative...
Ou si c bien par là que je dois passer pour m'en sortir !!
0
mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
16 juin 2008 à 19:11
bizarre la premiere version ça me parraissait bon je vois pas l'erreur la dsl... :(
0
MouchT8 Messages postés 22 Date d'inscription samedi 24 mai 2008 Statut Membre Dernière intervention 11 août 2008 1
17 juin 2008 à 17:59
J'ai réglé quelques problemes.
Il ne me reste plus qjavascript:;ue 2 erreurs toutes betes a mon avis..

Voila mon code mis a jour:


#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<stdlib.h>


#define MAXMOTS 100	//nombre maximum de mots dans le dictionnaire
#define LONGMOT 20 	//longueur en carcatere d'un mot


//initialisation de la fonction de recherche dichotomique
short dichotomie(char dico[MAXMOTS][LONGMOT],char *mot,short nb_mots){


int i,j,k,trouve,indice;		//i->debut, j->fin
int strcmp (const char *s1, const char *s2);


i=0;
j=nb_mots;
trouve=0;

while(i<=j && trouve == 0) {				
	
int moy;		//moyenne de(i,j)
moy=(i+j)/2;
k=moy;


if(strcmp(dico[k],mot)==0) {
	trouve=1;
}
if(strcmp(dico[k],mot)>0) {
	j=k-1;}
else{
	i=k+1;
}
}



if(trouve==0){indice=0;}	//si mot n'a pas été trouvé
if(trouve==1){indice=1;}	//si mot a été trouvé

return indice;
}

//initialisation des fonction de supression des majuscules et de la ponctuation
void sup_ponc(char *pmot){
				
int i=0,j=0;
char c;
				
//Traitement
while (pmot[i]!= 0){
c=pmot[i];
if (isalpha(c)){
pmot[j]=c;
j++;
}
i++;
}
pmot[j]=0;
}


void sup_maj(char *pmot){
				
int i=0;
char c;

//Traitement
while (pmot[i]!=NULL){
c=pmot[i];
if (isupper(c))
c=tolower(c);
pmot[i]=c;
i++;
}
pmot[i]=0;
}





//FONCTION PRINCIPALE main()



int main (int argc, char **argv) {

FILE * f;

char mot_texte[LONGMOT];	//mot lu dans le fichier texte
char dico[MAXMOTS][LONGMOT];
char *pmot;
char *fichier_texte; //nom du fichier à ouvrir et traiter


int i,j,k;
char mot[100];
short nb_mots;



printf("Veuillez entrer le nom du fichier texte a traiter pour la recherche dichotomique svp: ");
fgets (fichier_texte, sizeof fichier_texte, stdin); 

f=fopen("dico.dat","r");


//lecture mot par mot de tout le fichier et stockage dans un tableau en mémoire (dico)
i=0;
while(fgetc(f)!=EOF)
{
	fgets(dico[i],19,f);
	i++;
}



fclose(f);

//tri en mémoire du tableau dico
qsort(dico,nb_mots,LONGMOT,&strcmp);

//ouverture du fichier texte en lecture
f=fopen ("argv","r");

pmot=mot;

//TRAITEMENT POUR CHAQUE MOT DU TEXTE: suppression de majuscule et de ponctuation
for (i=0; i<nb_mots;i++){
sup_ponc(pmot);
sup_maj(pmot);

}

//recherche du mot dans le tableau dico à l'aide de la fonction dichotomie
dichotomie(dico,mot,nb_mots);

if (dichotomie==0){
char rep[5];	//variable pourla réponse de l'utilisateur
fprintf (f,"Le mot n'existe pas. Voulez vous l'ajouter au dictionnaire? \n");
fscanf(f,"%s",&rep);

if (strcmp(rep,"oui")==0) {
strcpy_s(dico[i],mot);		//Ajout du mot dans le dico
qsort (dico, nb_mots,LONGMOT, strcmp);			// Tri en mémoire, une nouvelle fois, du tableau dico
}
}

fclose(f);

f=fopen("dico.dat","a");

for (i=0; i<MAXMOTS; i++) {
fputs(dico[i],f);
}

fclose(f);

}



Et mes erreurs :

Erreur 1 error C2664: 'qsort' : impossible de convertir le paramètre 4 de 'int (__cdecl *)(const char *,const char *)' en 'int (__cdecl *)(const void *,const void *)'

Erreur 2 error C2664: 'qsort' : impossible de convertir le paramètre 4 de 'int (__cdecl *)(const char *,const char *)' en 'int (__cdecl *)(const void *,const void *)'

J'ai donc un probleme avec mes deux fonction qsort:

ici:

fclose(f);

//tri en mémoire du tableau dico
qsort(dico,nb_mots,LONGMOT,&strcmp); //LA !!



et ici :

if (strcmp(rep,"oui")==0) {
strcpy_s(dico[i],mot);		//Ajout du mot dans le dico
qsort (dico, nb_mots,LONGMOT, strcmp);	//LA !!



Apparement j'utilise des "const void" et je doit avoir "const char".. ou l'inverse?
c'est la premiere fois que j'utilise qsort alors je suis un peut perdu quant à son utilisation !
0
Je sais, il est un peu tard, mais :

qsort (dico, nb_mots,LONGMOT, strcmp);

Si strcmp est considéré comme la fonction strcmp alors ca ne serait pas un
" int (__cdecl *)(const void *,const void *)" ???
0
mich62120 Messages postés 631 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 21 janvier 2010 6
29 mai 2008 à 17:01
Slt,

Je ne suis pas sur mais je pense que tu ne dois pas déclarer les fonctions mais simplement #include <stdio.h> car elle sont dans cette bibliothèque. Si tu les remets il pense que ce sont tes fonctions et donne une erreur (tu desapprouve fopen).

Demande confirmation à un connaisseur.

Mich
-1