Bonjour à tous
Voila j'aurais besoin d'un coup de main pour un petit programme surrement enfantin pour vous:
Dans mon programme principal :
- j'ouvre un fichier en lecture
- je fait appel à une procédure qui doit lire le premier mot du fichier et le mettre dans une chaine de caractère
Voilà ce que j'ai fait :
------------------------------------------------------------
Dans mon programme principal :
1 2 3 4 5 6 7 8 9 10
|
int main(int argc, char **argv){
FILE * fichier;
char * p;
p = (char*) calloc(50,sizeof(char));
fichier = fopen(argv[1], "r"); //ouverture du fichier
liremot(&fichier,&p); //lecture du premier mot
printf("Le premier mot du fichier est : %s\n",p); //affichage du premier mot |
----------------------------------------------------------------------------------------------
Ma procédure (dans un autre fichier .c)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
void liremot(FILE **f, char **p){
char c;
char * q = (*p);
while ((c = fgetc(*f)) == ' ') {} //permet d'ignorer les espaces avant le mot
*q = c;
while ((c = fgetc(*f)) != ' ') { //on lit les caractères suivant jusqu'à ce
//qu'on trouve un autre espace
q++;
*q=c;
} |
-------------------------------------------------------
Ca compile sans erreur, aucune erreur non plus avec valgrind.
Dans mon fichier test.sl j'ai écrit : "PRINT LET "
J'ai quelques questions à propos de ce truc, car en fait j'ai réussi à le faire fonctionner un peu en y allant au pif.....
1 / Est ce que je peut faire des simplifications ? (par exemple ne pas utiliser le pointeur q ou la variable c dans la procédure)
2/ Comment initialiser ma chaine de caratères p au début de la procédure : car si je lit le premier mot puis le second, pour le second au lieu d'obtenir LET j'obtient LETNT (la fin de PRINT est toujours la). En effet elle est seulement initialisée au début du programme avec la fonction calloc (et je doute que faire un free et un autre calloc a chaque fois soit une solution....)
3/ Comment je doit modifier cette ligne pour qu'il s'arrête également à un retour à la ligne, à une tabulation ou à la fin du fichier...?
1 2
|
while ((c = fgetc(*f)) != ' ') |
(ne suffit pas car si par exempe c'est le dernier mot du fichier il ne trouve pas d espace et j 'ai un segmentation fault...)
J'ai essayé :
while ((c = fgetc(*f)) != (' ' || '\n' || '\t' || EOF))
mais ca ne fonctionne pas
Voilà c'est tout pour le moment mais c'est le début d'un projet qui consiste à créer un interpreteur de "simple langage" donc je pense que j'aurais encore besoin de votre aide lol...
Partager