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...
[code]
#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]);
}
[/code]