GTFY
Messages postés8Date d'inscriptiondimanche 23 janvier 2005StatutMembreDernière intervention14 mai 2006
-
13 mai 2006 à 21:08
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 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è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]);
}
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 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
GTFY
Messages postés8Date d'inscriptiondimanche 23 janvier 2005StatutMembreDernière intervention14 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 ;)
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 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
GTFY
Messages postés8Date d'inscriptiondimanche 23 janvier 2005StatutMembreDernière intervention14 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 ?
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 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