Programmation C : gros blocage !

Fermé
Maryy - 3 janv. 2002 à 13:05
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 - 28 oct. 2007 à 14:12
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 !!!

7 réponses

Bobinours Messages postés 2898 Date d'inscription jeudi 26 avril 2001 Statut Membre Dernière intervention 21 mars 2013 504
3 janv. 2002 à 13:36
Quel est exactement ton problème ?

-= Bobinours =-
0
Le plus gros problème là, c'est que je n'arrive pas à lire les données des fichiers correctement. Par exemple, l'utilisateur va entrer le nom, l'adresse et la ville d'une personne, tout ça va venir s'enregistrer dans le fichier, correctement. Puis à la lecture, le programme est gêné par les espaces. Si l'adresse est "20 avenue de qqch", il va m'afficher que l'adresse est "20". Dès qu'il voit un espace il s'arrête.

J'ai pourtant utilisé un gets() pour récupérer les données, c'est à la lecture que ça marche mal.
0
tafiscobar Messages postés 1277 Date d'inscription jeudi 7 décembre 2000 Statut Contributeur Dernière intervention 26 février 2009 177
5 janv. 2002 à 23:05
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
0
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);
}
0
ali_camarche Messages postés 31 Date d'inscription dimanche 11 novembre 2001 Statut Membre Dernière intervention 12 février 2002 > Maryy
6 janv. 2002 à 12:38
rebonjour

bien sure pour la lecture aulieu de fwrite c'est fread;

Merci.
0
tafiscobar Messages postés 1277 Date d'inscription jeudi 7 décembre 2000 Statut Contributeur Dernière intervention 26 février 2009 177 > Maryy
6 janv. 2002 à 12:58
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
0
Maryy > tafiscobar Messages postés 1277 Date d'inscription jeudi 7 décembre 2000 Statut Contributeur Dernière intervention 26 février 2009
6 janv. 2002 à 13:17
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 !!!
0
ali_camarche Messages postés 31 Date d'inscription dimanche 11 novembre 2001 Statut Membre Dernière intervention 12 février 2002
6 janv. 2002 à 12:27
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.
0
sbareau Messages postés 13 Date d'inscription mardi 3 avril 2001 Statut Membre Dernière intervention 10 juin 2002
7 janv. 2002 à 11:18
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
0

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

Posez votre question
curley Messages postés 6 Date d'inscription samedi 27 octobre 2007 Statut Membre Dernière intervention 28 octobre 2007
27 oct. 2007 à 22:26
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
0
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 7 812
28 oct. 2007 à 02:25
Puisqu'il s'agit d'un nouveau problème merci d'ouvrir un nouveau post. Ensuite si tu veux qu'on ait une chance de t'aider à comprendre d'où vient ton erreur de compilation, il faut au moins nous donner le code source que tu essayes de compiler.

Bonne chance
0
SmallFitz Messages postés 351 Date d'inscription dimanche 21 octobre 2007 Statut Membre Dernière intervention 21 juin 2013 185
28 oct. 2007 à 02:09
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
0
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 7 812
28 oct. 2007 à 14:12
:)
0