Lecture fichier en C

Bonjour,

Devant faire un programme en C, mais ne connaissant que peu le langage je viens me renseigner quelque peu. Je dois parser un fichier qui contient des chiffres entiers, séparés soit pas un espace, soit par un retour à la ligne (grammaire dispo si jamais mais pas important).

Voilà, j’utilise donc Fgets, et il me stock mes lignes dans un tableau (variable “ligne”). Mon problème est que pour 350 par exemple, je me vois obligé de parcourir mon tableau, récupérer 3, multiplier par 10, lire 5, ajouter, etc… et le pire est que ce sont des charactères ascii, donc je dois compenser en soustrayant 48 à chaque récupération. Le code :

int i = 0; while(ligne[i] != '\n'){ printf("Actuel : %c\n", ligne[i]); nbRequetes = nbRequetes*10 + ligne[i] - 48; // TODO doit exister plus simple !!! printf("Nombre de requetes actuel : %d\n", nbRequetes); i++; }

Voilé comme indiqué en commentaire, existe-t-il plus simple ?!? Sans doute!
Merci d’avance pour votre aide généreuse.
Patrick.

J’ai eu le même problème il y a deux ans et je me rappelle avoir trouvé une commande qui faisait ça tout seul quelques mois plus tard. C’est tout bêtement “atoi” comme ascii to integer. Je ne me rappelle plus des subtilités de cette instruction, mais le manuel pourrait t’aider.

Si la grammaire se complexifie, regarde du côté de flex.

Voici un programme minimaliste qui fait ce dont tu parles (tres basique).
Inutile de parser ligne par ligne, mais je t’ai illustré l’usage de atoi pour info.
Aussi, man stdio, man printf, man scanf: ca sert!

[code]#include <stdio.h>
#include <assert.h>

int
main(int argc, char** argv)
{
if (argc < 2) exit 1;

int lu = 0;

FILE *f_in;

assert(f_in = fopen(argv[1], “rb”));

while(! feof(f_in))
{
fscanf(f_in, “%d”, &lu);
fprintf(stdout, “%d;”, lu);
}

fclose(f_in);

printf("\n%d", atoi(argv[2]));

exit(0);
}[/code]

/home/xxxxxxxx/VTK/ImportExport>a.out “lu.txt” 11 22
12 ;23 ;34 ;45 ;56 ;67 ;78 ;89 ;90 ;
11/home/xxxxxxxVTK/ImportExport>

lu.txt:
12 23 34
45 56 67
78
89
90

Attention à la valeur de retour de atoi(), il vaut mieux la tester avant de l’utiliser tel quel, car cette fonction ne fait aucune vérification sur d’éventuelles erreurs de conversion.

Pour plus de souplesse et de précaution, mieux vaut utiliser la foncton strtol.

vectra> J’ai un doute sur cette portion du code:

[quote=“vectra, post:4, topic: 28900”]while(! feof(f_in))
{
fscanf(f_in, “%d”, &lu);
fprintf(stdout, “%d ;”, lu);
}[/quote]

Si tu fais ça, tu vas afficher 2 fois le dernier nombre de ton fichier, car le flag indiquant qu’on a atteint la fin de fichier n’est levé qu’une fois qu’on a essayé de lire APRES la fin du fichier, donc tu vas faire une itération en trop.
Petite correction donc:

while(! feof(f_in)) { fscanf(f_in, "%d", &lu); if (!feof(f_in)) fprintf(stdout, "%d;", lu); }

Tu as probablement raison: je me borne juste à fournir la syntaxe, pas l’algo. Je pense que Mav’ est en première année d’un cycle informatique (bon p’tit gars, continue!), faut pas tout lui faire non plus, c’est pas un service à lui rendre…

haha