Lire dans un fichier en C
Résolu
kammans
-
kammans -
kammans -
Bonjour,
voila, mon probleme c'est que j'ai un fichier contenant plusieurs lignes:
Substructure computed by SDM: 10 atoms ; JUMP : 0.633206 0.665079
Substructure computed by SDM: 9 atoms ; JUMP : 0.627140 0.738871
Substructure computed by SDM: 10 atoms ; JUMP : 0.919522 0.932055
Substructure computed by SDM: 5 atoms ; JUMP : 0.530953 0.594615
Substructure computed by SDM: 7 atoms ; JUMP : 0.717799 0.734444
.
.
.
et je veux faire un programme en C qui lit le nombre d'atomes dans un tableau:
t[1]=10
t[2]=9
.
.
.
merci
voila, mon probleme c'est que j'ai un fichier contenant plusieurs lignes:
Substructure computed by SDM: 10 atoms ; JUMP : 0.633206 0.665079
Substructure computed by SDM: 9 atoms ; JUMP : 0.627140 0.738871
Substructure computed by SDM: 10 atoms ; JUMP : 0.919522 0.932055
Substructure computed by SDM: 5 atoms ; JUMP : 0.530953 0.594615
Substructure computed by SDM: 7 atoms ; JUMP : 0.717799 0.734444
.
.
.
et je veux faire un programme en C qui lit le nombre d'atomes dans un tableau:
t[1]=10
t[2]=9
.
.
.
merci
A voir également:
- Lire dans un fichier en C
- Lire le coran en français pdf - Télécharger - Histoire & Religion
- Lire un fichier epub - Guide
- Fichier bin - Guide
- Comment réduire la taille d'un fichier - Guide
- Fichier rar - Guide
8 réponses
Salut.
déjà les tableaux en C commencent à 0 pas à 1
Je pense qu'il faut faire une boucle du genre :
for (int i=0;i<N;++i)
{
fscanf(file_id,"Substructure computed by SDM: %d atoms ; JUMP : %f %f\n",(t+i),(j1+i),(j2+i));
}
déjà les tableaux en C commencent à 0 pas à 1
Je pense qu'il faut faire une boucle du genre :
for (int i=0;i<N;++i)
{
fscanf(file_id,"Substructure computed by SDM: %d atoms ; JUMP : %f %f\n",(t+i),(j1+i),(j2+i));
}
#include <stdlib.h>
int main(int argc, char **argv)
{
FILE *fichier;
char *temp;
long taille_file;
fichier = fopen(argv[1], "r");
//On fait pointer fichier vers la fin du fichier
fseek(fichier,SEEK_END,0);
/*On met la taille du fichier dans taille_fichier (car fichier pointe
vers la fin du fichier, sa position donne le nombre d'octets
pour arriver à la fin) */
taille_fichier=ftell(fichier);
//On refait pointer fichier au début du fichier
fseek(fichier,SEEK_SET,0);
//Allocation de temp avec la taille du fichier
temp=(char *)malloc(sizeof(char) * taille_fichier);
fscanf(fichier, "%s", temp);
printf("voila ce qu'il y a dans temp: ***%s***\n", temp);
fclose(fichier);
//On libère temp
free(temp);
return EXIT_SUCCESS;
}
c'est comme çà qu'on lit un fichier en C.
int main(int argc, char **argv)
{
FILE *fichier;
char *temp;
long taille_file;
fichier = fopen(argv[1], "r");
//On fait pointer fichier vers la fin du fichier
fseek(fichier,SEEK_END,0);
/*On met la taille du fichier dans taille_fichier (car fichier pointe
vers la fin du fichier, sa position donne le nombre d'octets
pour arriver à la fin) */
taille_fichier=ftell(fichier);
//On refait pointer fichier au début du fichier
fseek(fichier,SEEK_SET,0);
//Allocation de temp avec la taille du fichier
temp=(char *)malloc(sizeof(char) * taille_fichier);
fscanf(fichier, "%s", temp);
printf("voila ce qu'il y a dans temp: ***%s***\n", temp);
fclose(fichier);
//On libère temp
free(temp);
return EXIT_SUCCESS;
}
c'est comme çà qu'on lit un fichier en C.
"ne permet pas de sauter cette chaine de caracteres séparés par des espaces."
Comprends pas ce que tu veux dire par là.
Une autre technique est comme le suggère une peut eleanor de stocker la ligne dans une chaîne de caractère puis de faire un sprintf ou un sscanf() sur cette châine.
Sinon, il est possible qu'il ne faille pas mettre de \n à la fin de mon scanf
Comprends pas ce que tu veux dire par là.
Une autre technique est comme le suggère une peut eleanor de stocker la ligne dans une chaîne de caractère puis de faire un sprintf ou un sscanf() sur cette châine.
Sinon, il est possible qu'il ne faille pas mettre de \n à la fin de mon scanf
si j'ai bien compris tu veux récupérer l'entier correspondant au nombre d'atome ?
dans ce cas c'est pas un problème de lecture de fichier mais de récupération de données.
dans ce cas c'est pas un problème de lecture de fichier mais de récupération de données.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Explique moi en quoi le scanf que je t'ai donnée ne fonctionne pas !
http://www.linux-france.org/article/man-fr/man3/scanf-3.html
Les blancs ne devraient pas poser de problème. Le fscanf est à mon avis la seule solution, car un fseek n'est pas possible étant donnée que la longueur de la chaîne est variable.
Je ne suis pas le seul à penser comme ça, tu retrouve les même commentaires ici :
https://forum.hardware.fr/hfr/Programmation/C/double-lecture-fscanf-sujet_78899_1.htm
soit fscanf() soit sscanf() après avoir lu la ligne et mi dans un string.
http://www.linux-france.org/article/man-fr/man3/scanf-3.html
Les blancs ne devraient pas poser de problème. Le fscanf est à mon avis la seule solution, car un fseek n'est pas possible étant donnée que la longueur de la chaîne est variable.
Je ne suis pas le seul à penser comme ça, tu retrouve les même commentaires ici :
https://forum.hardware.fr/hfr/Programmation/C/double-lecture-fscanf-sujet_78899_1.htm
soit fscanf() soit sscanf() après avoir lu la ligne et mi dans un string.
j'ai essayé avec le fgets mais j'arrive a lire que la premiere ligne après il affiche n'importe quoi.
SVP de l'aide!
#include<stdio.h>
#include<math.h>
int main(int argc, char*argv[])
{
char buf[512];
FILE *pf;
int i;
int j[2];
pf = fopen(argv[1],"r");
if (pf==NULL)
{
printf("ouverture du fichier impossible \n");
}
for (i=0;i<2;i++)
{
fgetline(buf,70,pf);
sscanf(buf,"%d",&j[i]);
printf("%d\n",j[i]);
}
return(0);
}
SVP de l'aide!
#include<stdio.h>
#include<math.h>
int main(int argc, char*argv[])
{
char buf[512];
FILE *pf;
int i;
int j[2];
pf = fopen(argv[1],"r");
if (pf==NULL)
{
printf("ouverture du fichier impossible \n");
}
for (i=0;i<2;i++)
{
fgetline(buf,70,pf);
sscanf(buf,"%d",&j[i]);
printf("%d\n",j[i]);
}
return(0);
}
Salut,
Voici un programme (bâclé mais fonctionnel) qui te lira les valeurs de ton fichier ;-))
Cdlt
Voici un programme (bâclé mais fonctionnel) qui te lira les valeurs de ton fichier ;-))
#include <stdio.h> #include <stdlib.h> int main(void){ FILE *fp=fopen("./fichier","r"); if(fp){ char buffer[256]; int t[100]; size_t i; size_t nb=0; while(fgets(buffer,sizeof buffer,fp)) sscanf(buffer,"Substructure computed by SDM: %d",&t[nb++]); for(i=0;i<nb;i++) printf("%d ",t[i]); free(fp),fp=NULL; } else return 1; putchar('\n'); return 0; }
Cdlt
Ba non, t"es trop con fiddy, on te dit que mettre "Substructure computed by SDM..." ça ne sert à rien. T'écoute vraiment rien ou quoi ? (ironique, au cas où... ;) )
kammans, t'es le roi des cons ! Tu as même réussi à me faire douter ! Tu fait chier le monde alors que la solution je te l'ai donné depuis le message 1 !
Donc, du coup j'ai récupéré ton fichier texte avec les atomes tout ça, et j'ai écris le code suivant :
Tu viens avec une question, on te donne la réponse, mais ça te plait pas. à ce moment là, arrête de poser des questions et démerde toi seul. Ou mieux, cesse d'être un abrutis et écoute ce qu'on te dit.
kammans, t'es le roi des cons ! Tu as même réussi à me faire douter ! Tu fait chier le monde alors que la solution je te l'ai donné depuis le message 1 !
Donc, du coup j'ai récupéré ton fichier texte avec les atomes tout ça, et j'ai écris le code suivant :
#include <stdio.h> #include <stdlib.h> int main() { int t[9],*a,i=0; float f1[9],f2[9]; FILE* fs=fopen("testCCM.dat","r"); a=t; while(!feof(fs)) { fscanf(fs,"Substructure computed by SDM: %d atoms ; JUMP : %f %f\n",a++,&f1[i],&f2[i]); printf("t vaut : %d, f1 %f f2 %f\n",t[i],f1[i],f2[i]); i++; } fclose(fs); system("pause"); return 0; }Et Ô ! miracle ça fonctionne !!!!
Tu viens avec une question, on te donne la réponse, mais ça te plait pas. à ce moment là, arrête de poser des questions et démerde toi seul. Ou mieux, cesse d'être un abrutis et écoute ce qu'on te dit.
merci pour tous pour votre aide.
ce qui m'embete mnt c que j'arrive pas à utiliser le tableau que j'ai rempli avec ces nmbrs en dehors de la boucle,
par exemple si je fait:
for (i=0;i<n;i++)
{
fscanf(pf," Substructure computed by SDM: %d atoms ; JUMP : %f %f ",&t[i],&c1[i],&c2[i]);
printf(" %d \n",t[i]);
}
ça marche bien mais si je fait sortir le printf de la boucle en faisant une otr boucle pour l'affichage ou si j'affiche juste un element, il m'affiche n'importe quoi!
printf(" %d \n",t[0]);
==> 1060332181
il garde pas le tableau en memoire ou quoi???
ce qui m'embete mnt c que j'arrive pas à utiliser le tableau que j'ai rempli avec ces nmbrs en dehors de la boucle,
par exemple si je fait:
for (i=0;i<n;i++)
{
fscanf(pf," Substructure computed by SDM: %d atoms ; JUMP : %f %f ",&t[i],&c1[i],&c2[i]);
printf(" %d \n",t[i]);
}
ça marche bien mais si je fait sortir le printf de la boucle en faisant une otr boucle pour l'affichage ou si j'affiche juste un element, il m'affiche n'importe quoi!
printf(" %d \n",t[0]);
==> 1060332181
il garde pas le tableau en memoire ou quoi???
#include<stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
FILE *pf;
int t[100];
float f1[10],f2[10];
int i;
int n=0, ca;
pf = fopen(argv[1],"r");
while ((ca = fgetc(pf)) != EOF)
{
if (ca == '\n')
{
n++;
}
}
printf("le nombre de lignes dans le fichier est: %i \n",n);
pf = fopen(argv[1],"r");
for (i=0;i<n-1;i++)
{
fscanf(pf,"Substructure computed by SDM: %d atoms ; JUMP : %f %f\n", &t[i],&f1[i],&f2[i]);
}
printf("%d %f\n",t[0],f1[0]);
}
mais le problème c'est que ecrire "Substructure computed by SDM: %d dans la syntaxe de fscanf ne permet pas de sauter cette chaine de caracteres séparés par des espaces.