Programmation C : gros blocage !
Bonjour,
Je suis actuellement en train de développer un prog en C (bcp d'intéraction avec les fichiers) mais j'ai vraiment de gros problèmes. Si qqn pense pouvoir m'aider, envoyez-moi un mail et je vous expliquerai ma galère (qui n'en sera peut-être pas pour vous !).
Merci d'avance !!!
Je suis actuellement en train de développer un prog en C (bcp d'intéraction avec les fichiers) mais j'ai vraiment de gros problèmes. Si qqn pense pouvoir m'aider, envoyez-moi un mail et je vous expliquerai ma galère (qui n'en sera peut-être pas pour vous !).
Merci d'avance !!!
A voir également:
- Programmation C : gros blocage !
- Application de programmation - Guide
- Programmation envoi sms - Guide
- Programmation vb - Télécharger - Langages
- Programmation binaire - Guide
- Programmation télécommande porte de garage brico depot - Forum Matériel & Système
7 réponses
je te conseillerai d'utiliser un type structure pour ecrire sur ton fichier qui sera un fichier a acces direct(donc une cle s'impose).
par exemple:
typedef char chaine[100];
struct personne
{
chaine nom,prenom,adresse;
int num;
};
et il saisit suivant ce que tu veux q'il inscrive et tu enregistre la structure ds ton fichier en retenant son numero qui sera uniq.
num n'est qu'un exemple, par exemple apres chaq saisie tu incrementes num et enregistres la structure(mais je ne sais pas si tu dois enregistrer un a un les champs).J'ai jamais fait
tafiscobar
par exemple:
typedef char chaine[100];
struct personne
{
chaine nom,prenom,adresse;
int num;
};
et il saisit suivant ce que tu veux q'il inscrive et tu enregistre la structure ds ton fichier en retenant son numero qui sera uniq.
num n'est qu'un exemple, par exemple apres chaq saisie tu incrementes num et enregistres la structure(mais je ne sais pas si tu dois enregistrer un a un les champs).J'ai jamais fait
tafiscobar
En fait, oui, j'ai créé une structure et le numéro unique, c'est le numéro insee du salarié. L'écriture se passe bien, c'est à la lecture que ça marche pas comme je le voudrais. Je vous envois le fichier "salaries.c", le prog n'est pas complet mais peut-être que vous trouverez des erreurs ou quelque chose qui cloche. En fait, dans ce fichier, si on écrit un nom composé (donc séparé par un espace), il ne prend en compte que la partie du nom qui est avant l'espace. Il y a ici la structure et deux fonctions qui permettent d'ajouter des fiches salariés et de lire les fiches salariés.
struct salarie
{
int num_sal; //numéro de sécurité sociale
char prenom[50];
char nom[70];
int salaire;
char ancien_total[4]; //rep = oui ou non
char ancien_ent[4]; //rep = oui ou non
};
//struct salarie list[nbsal];
struct salarie list[50];
FILE *fps;
void ajout_sal()
{
int i;
int ch;
fps=fopen("salaries.txt", "a");
printf("combien voulez-vous ajouter de salaries ?\n");
scanf("%d", &ch);
//for (i=0; i<nb_sal(nbsal); i++)
for (i=0; i<ch; i++)
{
printf("\nEnregistrement des salaries :\n");
printf("-----------------------------\n");
printf("Numero Securite Sociale : ");
scanf("%d", &list[i].num_sal);
printf("Prenom : ");
scanf("%s", list[i].prenom);
printf("Nom : ");
getchar();
gets(list[i].nom);
printf("Salaire : ");
scanf("%d", &list[i].salaire);
printf("Anciennete totale superieure a 24 mois ? : ");
scanf("%s", list[i].ancien_total);
printf("Anciennete dans l entreprise superieure a 12 mois ? : ");
scanf("%s", list[i].ancien_ent);
getchar();
//fwrite(&list, sizeof(list), 1, fps);
fprintf(fps, "%d %s %s %d %s %s\n", list[i].num_sal, list[i].prenom, list[i].nom, list[i].salaire, list[i].ancien_total, list[i].ancien_ent);
}
fclose(fps);
}
void lire_sal()
{
char nomch[70];
int i=0;
int compar, ancien1, ancien2;
char ok[4]="oui";
fps=fopen("salaries.txt", "r");
printf("choisissez le nom du salarie a consulter : ");
scanf("%s", &nomch);
getchar();
for (i=0; i<5; i++)
{
//fread(&list,sizeof(list), 1, fps);
fscanf(fps, "%d %s %s %d %s %s", &list[i].num_sal, &list[i].prenom, &list[i].nom, &list[i].salaire, &list[i].ancien_total, &list[i].ancien_ent);
compar=strcmp(nomch, list[i].nom);
if (compar == 0)
{
printf("\nIdentite du salarie :\n");
printf("Numero Securite Sociale : %d\n", list[i].num_sal);
printf("Prenom : %s\n", list[i].prenom);
printf("Nom : %s\n", list[i].nom);
printf("Salaire : %d\n", list[i].salaire);
ancien1=strcmp(ok, list[i].ancien_total);
ancien2=strcmp(ok, list[i].ancien_ent);
printf("Anciennete suffisante pour un stage : ");
if ((ancien1 == 0) && (ancien2 == 0))
{
printf("oui\n");
}
else
{
printf("non\n");
}
}
}
fclose(fps);
}
struct salarie
{
int num_sal; //numéro de sécurité sociale
char prenom[50];
char nom[70];
int salaire;
char ancien_total[4]; //rep = oui ou non
char ancien_ent[4]; //rep = oui ou non
};
//struct salarie list[nbsal];
struct salarie list[50];
FILE *fps;
void ajout_sal()
{
int i;
int ch;
fps=fopen("salaries.txt", "a");
printf("combien voulez-vous ajouter de salaries ?\n");
scanf("%d", &ch);
//for (i=0; i<nb_sal(nbsal); i++)
for (i=0; i<ch; i++)
{
printf("\nEnregistrement des salaries :\n");
printf("-----------------------------\n");
printf("Numero Securite Sociale : ");
scanf("%d", &list[i].num_sal);
printf("Prenom : ");
scanf("%s", list[i].prenom);
printf("Nom : ");
getchar();
gets(list[i].nom);
printf("Salaire : ");
scanf("%d", &list[i].salaire);
printf("Anciennete totale superieure a 24 mois ? : ");
scanf("%s", list[i].ancien_total);
printf("Anciennete dans l entreprise superieure a 12 mois ? : ");
scanf("%s", list[i].ancien_ent);
getchar();
//fwrite(&list, sizeof(list), 1, fps);
fprintf(fps, "%d %s %s %d %s %s\n", list[i].num_sal, list[i].prenom, list[i].nom, list[i].salaire, list[i].ancien_total, list[i].ancien_ent);
}
fclose(fps);
}
void lire_sal()
{
char nomch[70];
int i=0;
int compar, ancien1, ancien2;
char ok[4]="oui";
fps=fopen("salaries.txt", "r");
printf("choisissez le nom du salarie a consulter : ");
scanf("%s", &nomch);
getchar();
for (i=0; i<5; i++)
{
//fread(&list,sizeof(list), 1, fps);
fscanf(fps, "%d %s %s %d %s %s", &list[i].num_sal, &list[i].prenom, &list[i].nom, &list[i].salaire, &list[i].ancien_total, &list[i].ancien_ent);
compar=strcmp(nomch, list[i].nom);
if (compar == 0)
{
printf("\nIdentite du salarie :\n");
printf("Numero Securite Sociale : %d\n", list[i].num_sal);
printf("Prenom : %s\n", list[i].prenom);
printf("Nom : %s\n", list[i].nom);
printf("Salaire : %d\n", list[i].salaire);
ancien1=strcmp(ok, list[i].ancien_total);
ancien2=strcmp(ok, list[i].ancien_ent);
printf("Anciennete suffisante pour un stage : ");
if ((ancien1 == 0) && (ancien2 == 0))
{
printf("oui\n");
}
else
{
printf("non\n");
}
}
}
fclose(fps);
}
tu sais strcmp, compare ce qu'il considere etre la chaine, or par defaut, il considere qu'1e chaine s'arrete par defaut au premier espace, a moins de specifier au compilateur que l'ecriture de la chaine peut contenir de l'espace,donc il faut utiliser une fonction qui lui permet de savoir que tu vas peut etre saisir de l'espace, en C++, c'est la methode getline de l'objet cin, ex:
cin.getline(variable, taille de la variable,'\n');
('\n' est le caractere de fin)
donc pour saisir le nom, tu fais:
cin.getline(liste[i].nom,100,'\n');
Sinon, essaie toujours ce qu'a dit ali, avec fread, ça devrait marcher puisque le compila
tafiscobar
cin.getline(variable, taille de la variable,'\n');
('\n' est le caractere de fin)
donc pour saisir le nom, tu fais:
cin.getline(liste[i].nom,100,'\n');
Sinon, essaie toujours ce qu'a dit ali, avec fread, ça devrait marcher puisque le compila
tafiscobar
J'ai suivi le conseil d'Ali et ça ne marchait toujours pas. En fait, y'a aussi que j'avais mis scanf pour récupérer le nom du salarié à chercher. Je l'ai remplacé par un gets et ça passe impeccable. Je vous remercie à tous les deux, je crois que je vais pouvoir avancer pas mal cet aprèm !
Tafiscobar, au fait, c'est pas en C++ que je veux faire mon prog, c'est en C, donc pas de cin ou cout. Je n'ai donc pas testé ta solution mais je la garde sous le coude, ça pourrait bien me dépanner quand je vais devoir faire mon appli en C++ ! ;)
Merci !!!
Tafiscobar, au fait, c'est pas en C++ que je veux faire mon prog, c'est en C, donc pas de cin ou cout. Je n'ai donc pas testé ta solution mais je la garde sous le coude, ça pourrait bien me dépanner quand je vais devoir faire mon appli en C++ ! ;)
Merci !!!
bonjour
Moi pour ce grand probleme, je vous conseil d'ajouter que puisque
vous avez utilise un stricture de taille fixe (sizeof(struct salarie))
alors pourquoi vous n'ajoutez pas un salarie comme ca:
fwrite(&list[i],sizeof(struct salarie), 1, fps);
aulieu de: fprintf(fps, "%d %s %s %d %s %s\n", list[i].num_sal,
list[i].prenom, list[i].nom, list[i].salaire, list[i].ancien_total,
list[i].ancien_ent);
et de lire comme ca:
fwrite(&list[i],sizeof(struct salarie), 1, fps);
aulieu de: fscanf(fps, "%d %s %s %d %s %s", &list[i].num_sal,
&list[i].prenom, &list[i].nom, &list[i].salaire,
&list[i].ancien_total, &list[i].ancien_ent);
Normalement ca va marche.Informe moi du resultat.
Amicalement Ali.
Moi pour ce grand probleme, je vous conseil d'ajouter que puisque
vous avez utilise un stricture de taille fixe (sizeof(struct salarie))
alors pourquoi vous n'ajoutez pas un salarie comme ca:
fwrite(&list[i],sizeof(struct salarie), 1, fps);
aulieu de: fprintf(fps, "%d %s %s %d %s %s\n", list[i].num_sal,
list[i].prenom, list[i].nom, list[i].salaire, list[i].ancien_total,
list[i].ancien_ent);
et de lire comme ca:
fwrite(&list[i],sizeof(struct salarie), 1, fps);
aulieu de: fscanf(fps, "%d %s %s %d %s %s", &list[i].num_sal,
&list[i].prenom, &list[i].nom, &list[i].salaire,
&list[i].ancien_total, &list[i].ancien_ent);
Normalement ca va marche.Informe moi du resultat.
Amicalement Ali.
salut,
tu peux aussi donner un format a ton fichier : une taille constante par champs ainsi ton fichier est correctement structure.
et du coup tu as :
fprintf(fps, "%6d%30s%30s%6d%6s%6s\n", list[i].num_sal,
list[i].prenom, list[i].nom, list[i].salaire, list[i].ancien_total,
list[i].ancien_ent);
fscanf(fps, "%6d%30s%30s%6d%6s%6s\n", &list[i].num_sal,
&list[i].prenom, &list[i].nom, &list[i].salaire,
&list[i].ancien_total, &list[i].ancien_ent);
steph
tu peux aussi donner un format a ton fichier : une taille constante par champs ainsi ton fichier est correctement structure.
et du coup tu as :
fprintf(fps, "%6d%30s%30s%6d%6s%6s\n", list[i].num_sal,
list[i].prenom, list[i].nom, list[i].salaire, list[i].ancien_total,
list[i].ancien_ent);
fscanf(fps, "%6d%30s%30s%6d%6s%6s\n", &list[i].num_sal,
&list[i].prenom, &list[i].nom, &list[i].salaire,
&list[i].ancien_total, &list[i].ancien_ent);
steph
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Bonjour à vous,
Je suis débutant en programmation C. Je suis à l'heure actuelle en train de faire un exercice. J'ai rédigé le programme et cela bloque quand je fais la compilation. Est-ce que quelqu'un pourrait m'aider !
Curley
Je suis débutant en programmation C. Je suis à l'heure actuelle en train de faire un exercice. J'ai rédigé le programme et cela bloque quand je fais la compilation. Est-ce que quelqu'un pourrait m'aider !
Curley
Salut !
Tu viens de remonter un topic datant de janvier, et ton sujet n'a rien a voir avec ça !
Je pense qu'il serait préférable que tu en crée un nouveau bien à toi xD.
EDIT :
Tu viens de créer 3 topics les mêmes !!! Arrêtes t'es pas tout seul ok ?
http://www.commentcamarche.net/forum/affich 3884361 gros blocage pour prog c#0
http://www.commentcamarche.net/forum/affich 2095088 debutant en programmation c en probleme#0
Tu viens de remonter un topic datant de janvier, et ton sujet n'a rien a voir avec ça !
Je pense qu'il serait préférable que tu en crée un nouveau bien à toi xD.
EDIT :
Tu viens de créer 3 topics les mêmes !!! Arrêtes t'es pas tout seul ok ?
http://www.commentcamarche.net/forum/affich 3884361 gros blocage pour prog c#0
http://www.commentcamarche.net/forum/affich 2095088 debutant en programmation c en probleme#0
J'ai pourtant utilisé un gets() pour récupérer les données, c'est à la lecture que ça marche mal.