[ C ]Lecture d'un algo dans un fichier texte
timon44
Messages postés
56
Statut
Membre
-
fiddy Messages postés 11653 Date d'inscription Statut Contributeur Dernière intervention -
fiddy Messages postés 11653 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour à tous !
Voila je voudrai lire un fichier texte qui contient un algoritheme simple
(si...alors...sinon...fsi / tantque...faire.....fintantque)
J'arrive à lire le fichier texte .... mais je n'arrive vraiment pas à faire ce que je veux (surtout s'il y a de l'imbrication ...)
Voila ce que j'ai fait pour le moment :
Bien sûr, erreur de compil : j'appelle la fonction affiche2 avant qu'elle ne soit déclarer. Et affiche1 est appelé dans affiche2 bien sûr ...
Quelqu'un a une solution à ce problème ?
Merci !
Voila je voudrai lire un fichier texte qui contient un algoritheme simple
(si...alors...sinon...fsi / tantque...faire.....fintantque)
J'arrive à lire le fichier texte .... mais je n'arrive vraiment pas à faire ce que je veux (surtout s'il y a de l'imbrication ...)
Voila ce que j'ai fait pour le moment :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char mot[200];
char arc[200];
int debut = 1;
int compteurSi = 0;
int compteurTantQue = 0;
int s=1; //numerode sommet
int a=1; // numero d'arc
int position=0;
int numSommet=1;
int numArc=1;
typedef struct Arc Arc;
struct Arc
{
int numeroArc;
char etiquette[100];
};
typedef struct Sommet Sommet;
struct Sommet
{
int numeroSommet;
char etiquette[100]; // si, sinon, alors
Arc arcEntrant;
Arc arcSortant;
};
Sommet TabSommet[1000];
Arc TabArc[1000];
// affiche le graphe aprés un alors/sinon/faire
void affiche1(FILE *fichier)
{
TabSommet[s].numeroSommet = s;
strcpy (TabSommet[s].etiquette,mot);
printf("Numero du sommet : %d \n",TabSommet[s].numeroSommet);
printf("Etiquette sommet : %s \n",TabSommet[s].etiquette);
printf("Numero arc entrant: %d \n",TabArc[a-1].numeroArc);
printf("Numero arc sortant: %d \n\n",TabArc[a].numeroArc);
fscanf(fichier, "%s", arc);
fscanf(fichier, "%s", mot);
/*si aprés la condition, il y a "alors" on ne fait pas la boucle
sinon on lit les conditions jusqu'à ce qu'il y ai un "alors" */
while (strcmp(mot, "alors") != 0)
{
strcat(arc," ");
strcat(arc,mot);
fscanf(fichier, "%s", mot);
} // fin boucle pour l'arc
TabArc[a].numeroArc=a;
strcpy (TabArc[a].etiquette,arc);
s++;
TabSommet[s].numeroSommet = s;
strcpy (TabSommet[s].etiquette,mot); // le dernier mot qu'on a lu est un alors (fin de boucle !)
TabSommet[s].arcSortant=TabArc[a+1];
TabSommet[s].arcEntrant=TabArc[a];
printf("Numero arc: %d \n",TabArc[a].numeroArc);
printf("Etiquette arc: %s \n\n",TabArc[a].etiquette);
//sommet "alors"
printf("Numero du sommet : %d \n",TabSommet[s].numeroSommet);
printf("Etiquette sommet : %s \n",TabSommet[s].etiquette);
printf("Numero arc entrant: %d \n",TabArc[a].numeroArc);
printf("Numero arc sortant: %d \n\n",TabArc[a].numeroArc);
a++;
s++;
affiche2(fichier);
} // fin affiche graphe
void affiche2(FILE *fichier)
{
/*afficheDebutGraphe, on a affiché le "si" ou le 'tantque', larc, et le "alors" ou le "faire"
*/
fscanf(fichier, "%s", mot); // on lit le mot aprés le "alors"
if (strcmp(mot, "si") == 0)
{
compteurSi++;
affiche1(fichier); // on affiche le sommet "si", son arc, et le "alors" puis on reviens sur affiche2
}
else if (strcmp(mot, "tantque") == 0)
{
affiche1(fichier); // affiche sommet "tantque", l'arc, et le sommet "faire"
// compteurfaire++
}
else
{
memset(arc, 0, sizeof(arc)); //remise a zero de arc
int arret =0;
while (arret== 0)
{
if ((strcmp(mot,"sinon"))==0)
{ arret=1;}
else
{
if ((strcmp(mot,"fsi"))==0)
{ arret=1;}
else if ((strcmp(mot,"ftantque"))==0)
{ arret=1;}
else {
strcat(arc," ");
strcat(arc,mot);
fscanf(fichier, "%s", mot);
}
}
} // fwhile
// le dernier mot, est soit une "sinon" soit un "fsi"
TabArc[a].numeroArc=a;
strcpy (TabArc[a].etiquette,arc);
printf("Numero arc: %d \n",TabArc[a].numeroArc);
printf("Etiquette arc: %s \n",TabArc[a].etiquette);
a++;
if ((strcmp(mot,"sinon"))==0)
{
affiche2(fichier);// ffihce lesommmet sinon / et on refait affiche
}
else if ((strcmp(mot,"fsi"))==0)
{
affiche2(fichier); // compteurfsi++ ; affihce lesommmet fsi / on renvoi affiche
}
else if ((strcmp(mot,"ftantque"))==0)
{
// compteurftantque++ ; affihce lesommmet ftantque / on renvoi affiche
}
} //felse
}
void afficheDebutGraphe(FILE *fichier)
{
fscanf(fichier, "%s", mot);
if (strcmp(mot, "si") == 0)
{
compteurSi++;
debut=0;
// le numero du sommet
TabSommet[s].numeroSommet = s;
strcpy (TabSommet[s].etiquette,mot);
TabSommet[s].arcSortant=TabArc[a];
TabSommet[s].arcEntrant=TabArc[0];
s++;
fscanf(fichier, "%s", arc); // on lit la condition du si
fscanf(fichier, "%s", mot); // ce qu'il y a aprés: il peut y avoir plsrs conditions
/*si aprés la condition, il y a "alors" on ne fait pas la boucle
sinon on lit les conditions jusqu'à ce qu'il y ai un "alors" */
while (strcmp(mot, "alors") != 0)
{
strcat(arc," "); //on rajoute un espace car le fscanf ne les prends pas en compte
strcat(arc,mot);
fscanf(fichier, "%s", mot); // ce qu'il y a aprés: il peut y avoir plsrs conditions
} // fin boucle pour l'arc
// numArc : a = 1 (premiere lecture !)
TabArc[a].numeroArc=a;
strcpy (TabArc[a].etiquette,arc);
TabSommet[s].numeroSommet = s;
strcpy (TabSommet[s].etiquette,mot); // le dernier mot qu'on a lu est un alors (fin de boucle !)
printf("Numero du sommet : %d \n",TabSommet[s-1].numeroSommet);
printf("Etiquette sommet : %s \n",TabSommet[s-1].etiquette);
printf("Numero arc entrant: %d \n",0); //il n'y en a pas = 0
printf("Numero arc sortant: %d \n\n",TabArc[s-1].numeroArc);
printf("Numero arc: %d \n",TabArc[a].numeroArc);
printf("Etiquette arc: %s \n\n",TabArc[a].etiquette);
//sommet "alors" ou "faire"
printf("Numero du sommet : %d \n",TabSommet[s].numeroSommet);
printf("Etiquette sommet : %s \n",TabSommet[s].etiquette);
printf("Numero arc entrant: %d \n",TabArc[a].numeroArc);
printf("Numero arc sortant: %d \n\n",TabArc[a+1].numeroArc);
a++;
s++;
affiche2(fichier);
} //fin if "si"
else if (strcmp(mot, "tantque") == 0)
{
compteurTantQue++;
debut=0;
}
else
{
position = fgetc(fichier);
fseek(fichier, -1, SEEK_CUR);
if (position != EOF)
{
// on lit l'arc (instruction), genre initialisation de variable
}
else
{
if (debut==1){printf("\n le fichier est vide: il n'y a pas d'algorithme \n\n");}
}
}
}// fin affiche Debutgraphe
void prog(FILE *fichier)
{
int debut=1;
while (position != EOF)
{
//on test si c'est le premier while = premier sommet
fseek(fichier, -1, SEEK_CUR);
/*fscanf(fichier, "%s", mot);
//test si, sinon, alors ...
printf("%s \n",mot);*/
afficheDebutGraphe(fichier);
if (position != EOF){position = fgetc(fichier); }// On lit le caractère
}//fin while
}// FIN prog
int main(int argc, char *argv[])
{
FILE* fichier = NULL;
fichier = fopen("test.txt", "r+");
if (fichier != NULL)// On peut lire et écrire dans le fichier
{
prog(fichier);
fclose(fichier); // On ferme le fichier qui a été ouvert
}
else
{
// On affiche un message d'erreur si on veut
printf("Impossible d'ouvrir le fichier test.txt\n");
}
return 0;
} // fin main
Bien sûr, erreur de compil : j'appelle la fonction affiche2 avant qu'elle ne soit déclarer. Et affiche1 est appelé dans affiche2 bien sûr ...
Quelqu'un a une solution à ce problème ?
Merci !
A voir également:
- [ C ]Lecture d'un algo dans un fichier texte
- Comment ouvrir un fichier epub ? - Guide
- Comment réduire la taille d'un fichier - Guide
- Fichier bin - Guide
- Fichier rar - Guide
- Creer un fichier .bat - Guide