[C] Problème avec fgets

GTFY Messages postés 8 Date d'inscription dimanche 23 janvier 2005 Statut Membre Dernière intervention 14 mai 2006 - 13 mai 2006 à 21:08
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 - 14 mai 2006 à 20:47
Bonjour,



J'ai un problème et j'ai dans l'idée que ça vient de la fonction fgets.

Je dois lire deux fichiers en parallèle qui contiennent des BDD dont les valeurs des champs sont séparées par des ";".



La première ligne contient les informations relatives aux champs (nom
et type), et j'arrive à les lire et afficher, le tout mis en forme à ma
sauce. Donc jusqu'ici, pas de soucis, je lis et utilise les deux
fichiers en parallèle (du moins la première ligne de chacun).



En revanche, ça part en sucette après.



Au moins pour tester, je lis la seconde ligne de chaque fichier, fgets
stock tout ça dans deux tab différents, puis je relis chaque tab afin
d'isoler les champs qui m'intéresse. Celà fonctionne quand je traite un
seul des deux fichier. En revanche, quand je traite les deux, ça
déconne ! Quand j'affiche les deux champs qui m'intéressent (un de
chaque fichier), tout se mélange un peu.

Par exemple, là, il m'affiche correctement le champs que je veux pour
la seconde table, mais l'affichage correspondant à la première table me
renvoie le champs suivant de la seconde table...

Bref, là, je m'arrache pas mal les cheveux, et étant débutant, je me
dis que je passe très certainement à côté d'un truc évident... mais
quoi ?!

Voilà mon code... si jamais une bonne âme peut me venir en aide...





<meta http-equiv=  "Content-Type" content="text/html; charset=UTF-8">
<meta name="Generator" content="Kate, the KDE Advanced Text Editor">

#include <stdio.h>

int main(int argc, char** argv)
{
int i,j;
char ligne1[2048],ligne2[2048];;
int nbattributs=0;
char attribut[255][255];
char mot1[1][255],mot2[1][255];
int lettre=0;
int champs_1,champs_2;

FILE *table1;
table1 = fopen(argv[1], "rt");

FILE *table2;
table2 = fopen(argv[2], "rt");

 // Lecture de la premi&#232;re ligne afin de r&#233;cup&#233;rer le format de la table 

fgets(ligne1,500,table1);
fgets(ligne2,500,table2);
i =0;
j= 0;
printf("\n");
printf("FORMAT DES TABLES :\n\n");
printf("Table %s :\n  ",argv[1]);
 while (ligne1[i])
{
if(ligne1[i-1]! = 32 &amp;&amp; ligne1[i] !=  59)  // Affiche si la lettre n'est pas un ";" pr&#233;c&#233;d&#233; d'un espace 
{
 if (lettre   ==   0) printf("%d  ",j);
printf("%c",ligne1[i]);
 if (ligne1[i] ! = 32) attribut[nbattributs][lettre] =  ligne1[i];
lettre++;
}
 if (ligne1[i-1] ==  32 &amp;&amp; ligne1[i] == 99)  // Type c 
{
printf(" [chaine de caract&#232;res]");
}
 if (ligne1[i-1]  ==   32 &amp;&amp; ligne1[i] == 101)  // Type e 
{
printf(" [entier]");
}
 if (ligne1[i]   ==   59)  // Saut de ligne si ";" 
{
printf("\n  ");
nbattributs++;
lettre =0;
j++;
}

i++;
}
printf("\n");

i= 0;
j=0;
lettre=0;
printf("Table %s :\n  ",argv[2]);
 while (ligne2[i])
{
if(ligne2[i-1]! = 32 &amp;&amp; ligne2[i] !=  59)  // Affiche si la lettre n'est pas un ";" pr&#233;c&#233;d&#233; d'un espace 
{
 if (lettre   ==   0) printf("%d  ",j);
printf("%c",ligne2[i]);
 if (ligne2[i] ! = 32) attribut[nbattributs][lettre] =  ligne2[i];
lettre++;
}
 if (ligne2[i-1] ==  32 &amp;&amp; ligne2[i] == 99)  // Type c 
{
printf(" [chaine de caract&#232;res]");
}
 if (ligne2[i-1]  ==   32 &amp;&amp; ligne2[i] == 101)  // Type e 
{
printf(" [entier]");
}
 if (ligne2[i]   ==   59)  // Saut de ligne si ";" 
{
printf("\n  ");
nbattributs++;
lettre =0;
j++;
}

i++;
}
printf("\n");

// Demande des champs sur lesquels on souhaite faire l'&#233;qui-jointure

printf("Indices des champs sur lesquels on op&#232;re l'&#233;qui-jointure :\n");
printf("  Sur %s :\n",argv[1]);
scanf("%d",&amp;champs_1);
printf("  Sur %s :\n",argv[2]);
scanf("%d",&amp;champs_2);
printf("\n");

// Parcours des tables

fgets(ligne1,500,table1);
i =  0;
nbattributs = 0;
lettre = 0;
 while (ligne1[i])
{
if(ligne1[i] ! = 59)
{
mot1[nbattributs][lettre] =  ligne1[i];
lettre++;
}
 if (ligne1[i]  ==  59)  // Changement de mot si ";" 
{
nbattributs++;
lettre  = 0;
}
i++;
}


fgets(ligne2,500,table2);
j =  0;
nbattributs = 0;
lettre = 0;
 while (ligne2[j])
{
if(ligne2[j] ! = 59)
{
mot2[nbattributs][lettre] =  ligne2[j];
lettre++;
}
 if (ligne2[j]  == 59)  // Changement de mot si ";" 
{
nbattributs++;
lettre  = 0;
}
j++;
}

printf("Dernier %s : %s\n",argv[1],mot1[champs_1]);	
printf("Dernier %s : %s\n",argv[2],mot2[champs_2]);

}


13 réponses

GTFY Messages postés 8 Date d'inscription dimanche 23 janvier 2005 Statut Membre Dernière intervention 14 mai 2006
13 mai 2006 à 21:10
Désolé, j'ai foiré le post...

On édite comment ?
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
13 mai 2006 à 22:56
Les admins le peuvent je crois. Sinon, tu n'a qu'a reposter ton code correctement sur cette même question (à la suite de ce que je dit. Pas de nouvelle question).

___________________________________________
Les plus grands esprits trouvent toujours une solution
0
GTFY Messages postés 8 Date d'inscription dimanche 23 janvier 2005 Statut Membre Dernière intervention 14 mai 2006
13 mai 2006 à 23:17
Le truc, c'est que je ne connais pas la balise utilisée pour poster les codes :(
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
13 mai 2006 à 23:19
Tu n'a qu'a reprendre ton code et le poster ici en mettant les retours à la ligne au endroit aproprié.

___________________________________________
Les plus grands esprits trouvent toujours une solution
0

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

Posez votre question
cs_satellite34 Messages postés 688 Date d'inscription mercredi 6 avril 2005 Statut Membre Dernière intervention 2 juin 2006 1
13 mai 2006 à 23:30
oula, joli le post, je cherche justement un moyen d 'eviter ca pour mon forum.lol



@+;
satellite34
0
GTFY Messages postés 8 Date d'inscription dimanche 23 janvier 2005 Statut Membre Dernière intervention 14 mai 2006
14 mai 2006 à 09:27
include <stdio.h>
int main(int argc, char** argv)
{
int i,j;
char ligne1[2048],ligne2[2048];
int nbattributs=0;
char attribut[255][255];
char mot1[1][255],mot2[1][255];
int lettre=0;
int champs_1,champs_2;
FILE *table1;
table1 = fopen(argv[1], "rt");
FILE *table2;
table2 = fopen(argv[2], "rt");

// Lecture de la première ligne afin de récupérer le format de la table

fgets(ligne1,500,table1);
fgets(ligne2,500,table2);
i=0;
j=0;
printf("\n");
printf("FORMAT DES TABLES :\n\n");
printf("Table %s :\n ",argv[1]);
while(ligne1[i])
{
if(ligne1[i-1]!= 32 && ligne1[i] != 59) // Affiche si la lettre n'est pas un ";" précédé d'un espace
{
if(lettre == 0) printf("%d ",j);
printf("%c",ligne1[i]);
if(ligne1[i] != 32) attribut[nbattributs][lettre] = ligne1[i];
lettre++;
}
if(ligne1[i-1]== 32 && ligne1[i] == 99) // Type c
{
printf(" [chaine de caractères]");
}
if(ligne1[i-1]== 32 && ligne1[i] == 101) // Type e
{
printf(" [entier]");
}
if(ligne1[i] == 59) // Saut de ligne si ";"
{
printf("\n ");
nbattributs++;
lettre=0;
j++;
}
i++;
}
printf("\n");
i=0;
j=0;
lettre=0;
printf("Table %s :\n ",argv[2]);
while(ligne2[i])
{
if(ligne2[i-1]!= 32 && ligne2[i] != 59) // Affiche si la lettre n'est pas un ";" précédé d'un espace
{
if(lettre == 0) printf("%d ",j);
printf("%c",ligne2[i]);
if(ligne2[i] != 32) attribut[nbattributs][lettre] = ligne2[i];
lettre++;
}
if(ligne2[i-1]== 32 && ligne2[i] == 99) // Type c
{
printf(" [chaine de caractères]");
}
if(ligne2[i-1]== 32 && ligne2[i] == 101) // Type e
{
printf(" [entier]");
}
if(ligne2[i] == 59) // Saut de ligne si ";"
{
printf("\n ");
nbattributs++;
lettre=0;
j++;
}
i++;
}
printf("\n");
// Demande des champs sur lesquels on souhaite faire l'équi-jointure
printf("Indices des champs sur lesquels on opère l'équi-jointure :\n");
printf(" Sur %s :\n",argv[1]);
scanf("%d",&champs_1);
printf(" Sur %s :\n",argv[2]);
scanf("%d",&champs_2);
printf("\n"); // Parcours des tables
fgets(ligne1,500,table1);
i = 0;
nbattributs = 0;
lettre = 0;
while(ligne1[i])
{
if(ligne1[i] != 59)
{
mot1[nbattributs][lettre] = ligne1[i];
lettre++;
}
if(ligne1[i] == 59) // Changement de mot si ";"
{
nbattributs++;
lettre = 0;
}
i++;
}
fgets(ligne2,500,table2);
j = 0;
nbattributs = 0;
lettre = 0;
while(ligne2[j])
{
if(ligne2[j] != 59)
{
mot2[nbattributs][lettre] = ligne2[j];
lettre++;
}
if(ligne2[j] == 59) // Changement de mot si ";"
{
nbattributs++;
lettre = 0;
}
j++;
}
printf("Dernier %s : %s\n",argv[1],mot1[champs_1]);
printf("Dernier %s : %s\n",argv[2],mot2[champs_2]);
}
0
GTFY Messages postés 8 Date d'inscription dimanche 23 janvier 2005 Statut Membre Dernière intervention 14 mai 2006
14 mai 2006 à 09:29
Désolé, normalement, il est mis en forme...
0
GTFY Messages postés 8 Date d'inscription dimanche 23 janvier 2005 Statut Membre Dernière intervention 14 mai 2006
14 mai 2006 à 15:59
Bon, j'ai trouver...
Si les admins voulaient bien supprimer ce sujet d'une inutilité flagrante, ça serait bien ;)
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
14 mai 2006 à 19:01
Peut tu nous expliquer quel était le problème?

___________________________________________
Les plus grands esprits trouvent toujours une solution
0
GTFY Messages postés 8 Date d'inscription dimanche 23 janvier 2005 Statut Membre Dernière intervention 14 mai 2006
14 mai 2006 à 19:24
Pour je ne sais plus quelle raison, j'avais déclaré mes deux tableaux récupérant les valeurs de mes champs par "char mot1[1][255],mot2[1][255];". Ce qui clochait, c'était le [1] bien sûr... sachant qu'il y avait plusieurs mots.
J'ai changé ça en déclarant mes tableaux après la première ligne qui récupère les intitulés des différents champs, en remplaçant [1] par [j] (vu qu'il correspond au nombre de champs de chaque table)...

Bref... en revanche, je ne sais toujours pas pourquoi mot1 récupéré la valeur suivant de mot2... mais bon !

Sinon, vous savez comment on poste les codes ou pas ?

Et puis merci beaucoup à SAKingdom pour sa patience ;)
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
14 mai 2006 à 19:29
Poster des codes sur ce site? Attention. Il doit être pertinant et utile sinon il sera supprimé par les admins.
Sinon rien de plus facile. Tu va dans le petit menu à gauche, Code, Ajouter une source. Mais je te préviend, il faut qu'il soit utile pour les autres programmeurs.
___________________________________________
Les plus grands esprits trouvent toujours une solution
0
GTFY Messages postés 8 Date d'inscription dimanche 23 janvier 2005 Statut Membre Dernière intervention 14 mai 2006
14 mai 2006 à 20:04
Oh non t'inquiète ! Je n'ai pas cette prétention !
Je parle juste de poster dans le forum, comme je l'ai fait là, mais il me semble qu'il y a des balises pour ça non ?
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
14 mai 2006 à 20:47
Quesque tu veux dire par balise. Des balise HTML? Je sais pas. Normalement, il suffis de copier coller le code.
D'habitude les retoure à la ligne sont supporté par ce site. Je comprend pas quesqu'y est arrivé avec ton post.

___________________________________________
Les plus grands esprits trouvent toujours une solution
0
Rejoignez-nous