|
|
|
|
struct compte
{
char numeroCpte [11]; //numero du compte
char typeCompte [7]; //type du compte: cheque ou epargne
char nomClient [50]; //nom du client
char prenomClient [50]; //prenom(s) du client
char statutClient [12]; //statut social du client: salarie ou non salarie
char categorieCompte [13]; //categorie du compte: particulier ou professionnel
char numeroClient [11]; //numero du client
char dateCreation [10]; //date de creation du compte
};
struct compte cpt; // declaration d'une variable cpt de type compte
void EnregDansFichier ()
{
char nomFichier [26]; //nom du fichier dans lequel il faut sauvegarder
int erreur;
int i;
FILE *sortie;
printf("Entrez le nom du fichier: ");
scanf("%s",&nomFichier);
sortie=fopen(nomFichier,"at");
if (sortie == NULL)
{
printf("Un probleme est survenue lors de la tentative d'enregistrement de vos donnees dans le fichier %s\n",nomFichier);
}
else
{
fprintf(sortie,"%s \n %s \n %s \n %s \n %s \n %s \n %s \n %s \n", cpt.numeroCpte, cpt.typeCompte, cpt.nomClient, cpt.prenomClient, cpt.statutClient, cpt.categorieCompte, cpt.numeroClient, cpt.dateCreation);
}
fclose(sortie);
}
void RechercheCpte ()
{
char numeroCpte [11];
char nomClient [50];
char nomFichier [26];
int trouve1, trouve2=0;
FILE *sortie;
printf ("Entrez le nom du fichier: "); scanf ("%s", nomFichier);
sortie=fopen(nomFichier, "rt");
printf ("\n\n\nEntrez le nom du client, ou le numero de compte que vous cherchez");
printf ("\n\n\nNumero compte: "); scanf ("%s", numeroCpte);
printf ("\n\n\nNom client: "); scanf ("%s", nomClient);
while (!EOF) // tant que la fin du fichier n'est pas atteint
{
if (numeroCpte) // si un numero de compte a ete saisi
{
if (nomClient) // si un numero de compte et un nom de client ont ete saisi
{
trouve1=(strcmp(nomClient, cpt.nomClient));
}
else // si un numero de compte a ete saisi, mais pas de nom client
{
trouve2=(strcmp(numeroCpte, cpt.numeroCpte));
}
}
else // si aucun numero de compte n'a ete saisi
{
if (nomClient) // si aucun numero de compte n'a ete saisi, mais qu'un numero de client a ete saisie
{
trouve1=(strcmp(nomClient, cpt.nomClient));
}
}
} // fin du while
if (trouve1)
{
fscanf(sortie,"%s \n %s \n %s \n %s \n %s \n %s \n %s \n %s \n", &cpt.numeroCpte, &cpt.typeCompte, &cpt.nomClient, &cpt.prenomClient, &cpt.statutClient, &cpt.categorieCompte, &cpt.numeroClient, &cpt.dateCreation);
}
system ("pause");
}
En fait dans la fonction recherche, j'ouvre le fichier, mais je ne sais pas comment le lire. |
|
1 - Tu ne lis pas dans le fichier quand tu fais tes comparaisons
declare une variable ou tu vas stocker le nom de client lu. idem pr le numero de compte. ensuite ajoute fscanf("%s\n, nomclient); avant de faire tes comparaisons avec strcmp 2 - tu dois rajouter un test a ta boucle while pour sortir de la boucle dès qu'un numero de compte ou un nom de client est trouvé dans le fichier. Sinon la valeur de tes variables trouve1 et trouve2 correspondront toujours au dernier champ de ton fichier (en l'occurence ici le champ dateCreation de ton dernier enregistrement) : while ((!EOF) || (!trouve1) || (!trouve2))
{
...
}
3 - meme si tu trouves ce que tu veux dans le fichier, ton fscanf ne va pas lire les bonnes valeurs dans ton fichier car ton pointeur de fichier se trouvera a la fin du champ (numero de compte ou nomClient) que tu viendra de trouver. Et la j'ai pas le temps de t'aider plus, dsl, je repasserais Moi je dis ça...je dis rien ^^ |
|
Finalement j'ai un peu de temps ...
Evite les espaces dans ton fprintf de ta fonction EnregDansFichier, ça c'est mieux : fprintf(sortie,"%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n",...); le mieux pour résoudre les problemes 1 et 3 c'est de déclarer un compte : cpt compt; Et que tu lises ton fichier compte par compte, c'est a dire que dans ton while tu auras : fscanf(sortie,"%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n", &compt.numeroCpte, &compt.typeCompte, &compt.nomClient, &compt.prenomClient, &compt.statutClient, &compt.categorieCompte, &compt.numeroClient, &compt.dateCreation); Comme ça tu n'a plus de problème avec le placement du pointeur dans ton fichier et ta structure est deja remplie quand tu sors de la boucle :) Moi je dis ça...je dis rien ^^ |
Merci Kiruasam pour ton aide.
J'ai refait la fonction rechercher ainsi: void RechercheCpte ()
{
char numeroCpte [11];
char nomClient [50];
char nomFichier [26];
int trouve1, trouve2=0;
FILE *sortie;
printf ("Entrez le nom du fichier: "); scanf ("%s", nomFichier);
sortie=fopen(nomFichier, "rt");
printf ("\n\n\nEntrez le nom du client, ou le numero de compte que vous cherchez");
printf ("\n\n\nNumero compte: "); scanf ("%s", numeroCpte);
printf ("\n\n\nNom client: "); scanf ("%s", nomClient);
while (!EOF || !trouve1 || !trouve2) // tant que la fin du fichier n'est pas atteint
{
if (numeroCpte) // si un numero de compte a ete saisi
{
if (nomClient) // si un numero de compte et un nom de client ont ete saisi
{
trouve1=(strcmp(nomClient, cpt.nomClient));
}
else // si un numero de compte a ete saisi, mais pas de nom client
{
trouve2=(strcmp(numeroCpte, cpt.numeroCpte));
}
}
else // si aucun numero de compte n'a ete saisi
{
if (nomClient) // si aucun numero de compte n'a ete saisi, mais qu'un numero de client a ete saisie
{
trouve1=(strcmp(nomClient, cpt.nomClient));
}
} // fin du if
fscanf(sortie,"%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n", &cpt.numeroCpte, &cpt.typeCompte, &cpt.nomClient, &cpt.prenomClient, &cpt.statutClient, &cpt.categorieCompte, &cpt.numeroClient, &cpt.dateCreation);
} // fin du while
fscanf(sortie,"%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n", &cpt.numeroCpte, &cpt.typeCompte, &cpt.nomClient, &cpt.prenomClient, &cpt.statutClient, &cpt.categorieCompte, &cpt.numeroClient, &cpt.dateCreation);
system ("pause");
}
Il n'ya pas d'erreurs C, mais le programme ne marche toujours pas; lorsque j'entre le nom que je cherche, et le numero du compte, le programme se plante; j'appuie sur la touche "entrée", mais il ne sort pas du while apparemment. J'ai vraiment besoin, car ça fait plusieurs jours déjà que je suis bloqué à ce niveau. |
|
Je te conseillerais un autre mode pour la saisie de l'utilisateur parce que la avec le scanf il est dans tout les cas obligé de renseigner un numero de compte et un nom (tapez entrée tout seul ce n'est pas possible).
Sinon j'ai testé ça qui fonctionne pour la recherche par numero de compte mais c'est loin d'etre parfait : int RechercheCpte ()
{
char numeroCpte [11];
char nomClient [50];
char nomFichier [26];
int trouve1=1, trouve2=1;
FILE *sortie;
printf ("Entrez le nom du fichier: ");
scanf ("%s", nomFichier);
sortie=fopen(nomFichier, "rt");
printf ("\n\n\nEntrez le nom du client, ou le numero de compte que vous cherchez");
printf ("\n\n\nNumero compte: "); scanf ("%s", numeroCpte);
printf ("\n\n\nNom client: "); scanf ("%s", nomClient);
while (fscanf(sortie,"%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n", &cpt.numeroCpte, &cpt.typeCompte, &cpt.nomClient, &cpt.prenomClient, &cpt.statutClient, &cpt.categorieCompte, &cpt.numeroClient, &cpt.dateCreation)!=EOF) // tant que la fin du fichier n'est pas atteint
{
if (numeroCpte) // si un numero de compte a ete saisi
{
trouve2=(strcmp(numeroCpte, cpt.numeroCpte));
}
if (trouve2!=0) // si compte pas trouver avec le numero de compte
if (nomClient) // si aucun numero de compte n'a ete saisi, mais qu'un numero de client a ete saisie
{
trouve1=(strcmp(nomClient, cpt.nomClient));
}
// si on a trouve on sort du while
if (trouve1==0 || trouve2==0) break;
} // fin du while
system ("pause");
if (trouve1==0 || trouve2==0) return 0;
else return 1;
}
int main() {
if ( RechercheCpte() == 0)
printf("Resultat :\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n", &cpt.numeroCpte, &cpt.typeCompte, &cpt.nomClient, &cpt.prenomClient, &cpt.statutClient, &cpt.categorieCompte, &cpt.numeroClient, &cpt.dateCreation);
else
printf("Erreur de recherche : le compte n'existe pas ou erreur de saisie");
return 0;
}
Moi je dis ça...je dis rien ^^ |
ki veux me parlé un peux sur le piratage je suis pret lol i swear mon surnom"HaCkEr-_-MaN" |
Post en mode IGNORED !
mounji Tu devrais jeter un coup d'oeil la charte du site. Et pour ton information, Hacker c'est mal et toi même tu peux faire l'objet d'un Hack tu trouveras ca moins rigolo ! |
|
Salutations,
Je me permets d'élaguer pour mieux voir (et aussi une bonne séparation interface utilisateur et coeur du programme c'est toujours plus sympa ^^) Je considère donc que la saisie est faite avant l'appel à la fonction de recherche et les critères passé en paramètres.
bool RechercheCpte ( char *pNomFichier, char *pNomClient, char *pNumeroCpte )
{
bool bTrouve = false;
FILE *sortie = 0;
// Ouverture du fichier
sortie = fopen(nomFichier, "rt");
// test de l'ouverture
if ( sortie == 0 )
return false;
// On se débarrasse des pointeur nuls ici pour alléger le reste plus loin...
if ( pNomClient == 0 )
pNomClient = "";
if ( pNumeroClient == 0 )
pNumeroClient = "";
// Recherche
while ( fread( &cpt, sizeof( struct compte ), 1, sortie ) )
{
if ( ( strcmp( pNomClient, cpt.nomClient ) == 0 ) ||
( strcmp( pNuméroClient, cpt.numeroClient ) == 0 ) )
{
bTrouve = true;
break;
}
}
// fermeture du fichier
fclose( sortie );
// Réponse
return bTrouve;
}
J'ai pas de compilo sous la main mais ça me parait bien comme cela... On pourra pour une sortie plus détaillée mettre un code de retour plutôt qu'un simple booléen. M. Edit.: J'ai aussi supposé que les compte enregistré dans le fichier avait leur numéro et nom de client différents de "". Whoops, j'avais pas que que ce sujet était de l'an dernier ^^"
|
|
bonjour,
j'aurais voulus savoir si une recherche du genre pouvais fonctionner pour mon probleme. l'utilisateur doit rentrer des mots clefs pour afficher un rapport. chaque rapport est dans un fichier.txt les mots clefs ont une place présise dans chaque rapport. ( ligne 5, 6, 7) j'aimerai savoir s'il est possible de parcourir tout les fichiers d'un dossier pour vérifier les mots clefs et si ces mots clefs corresponde a ce rentré par l'utilisateur il m'affiche le titre du fichier (qui est lui aussi dans fichier a la ligne 9). merci d'avance de vos réponses. cordialement |
bonjour tt le monde
d'abord cette if else n'a pas de sens : if (sortie == NULL) { printf("Un probleme est survenue lors de la tentative d'enregistrement de vos donnees dans le fichier %s\n",nomFichier); } else { puis t'a un gros prob en fait jamais la saisie d'une chaine de caractere de cette façon: scanf("%s",&nomFichier); le & ne doit pa etre la ou bien utulise <gets> et c'est mieux 3)pourquoi ces declarations char numeroCpte [11]; char nomClient [50]; char nomFichier [26]; tu as deja declarer la structure globale |
Résultats pour langage C: recherche dans un fichier
Résultats pour langage C: recherche dans un fichier
Résultats pour langage C: recherche dans un fichier
Résultats pour langage C: recherche dans un fichier