Lire un fichier .txt en C?

rundish Messages postés 14 Date d'inscription vendredi 21 mai 2004 Statut Membre Dernière intervention 21 mai 2004 - 21 mai 2004 à 10:09
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013 - 21 mai 2004 à 19:45
Bonjour à tous.
Voila j'explique mon problème. (je suis plus qu'un newbie en C).
J'ai un fichier txt contenant une série de nombre (des réels) séparés par une tabulation et ce sur plusieurs lignes. j'aimerai lire ce fichier pour mettre chacun de ces nombres dans un tableau.
Ceci en utilisant le C.
Comment on fait, SVP? Je n'arrive pas à trouver sur le net un truc simple.
Merci d'avance

30 réponses

rundish Messages postés 14 Date d'inscription vendredi 21 mai 2004 Statut Membre Dernière intervention 21 mai 2004
21 mai 2004 à 14:12
en fait, j'ai deux compilateur. j'ai le choix entre CVI de
National Instrument et microsoft visual C++.
l'erreur était avec le premier. cela fonctionne avec le second.
cependant, il ne doit pas pouvoir prendre en compte le "/t" comme séparateur et en plus, il ne me fourni pas les décimales :sad)
0
c2millet Messages postés 198 Date d'inscription lundi 2 juin 2003 Statut Membre Dernière intervention 15 février 2005
21 mai 2004 à 14:14
c pas "/t" mais "\t"
Cmill
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
21 mai 2004 à 14:16
vs2003 toolkit est gratuit, mais c'est en ligne de commande et ya que les bibliothèques standards
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
21 mai 2004 à 14:18
Normal qu'il ne te fournit pas les décimal c'est un tableau d'entier...
Au lieu de int Tab[...][...] tu dois mettre float Tab[...][...].
Puis il faut aussi remplacer la fonction atoi par atof car il s'agit encore de float...

Après tout devrais marcher mais je n'ai pas testé...

Puis comme c2millet l'a dis, c'est "\t" et non "/t"...

Après c'est petite modificatio ca devrais aller ....

A++ et bonne continuation...

Samir
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
rundish Messages postés 14 Date d'inscription vendredi 21 mai 2004 Statut Membre Dernière intervention 21 mai 2004
21 mai 2004 à 14:27
oui oui, c'est bien ce que j'ai écrit dans le code.
pour les décimales, c'est bon.
en revanche, il ne me lit que la première colone. donc, il estime que la ligne se fini après le premier nombre soit avec le "\t"
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
21 mai 2004 à 14:37
Ah bon ?
Je viens de tester chez moi et ca marche nickel ..
T'as du te planter quelque part !

Voici le code après modification :
#include <stdio.h>								// fonction de base(printf, fgets,....)
#include <string.h>								// strtok() -> decoupage de chaine de caracteres
#include <stdlib.h>								// atoi -> convertir une chaine de caractere en un entier

#define CMAX				400					// Nombre de ligne maximum du tableau
#define LMAX				400					// Nombre de colonne maximum du tableau
#define MAX_CHAR_PER_LINE	1650				// Nombre de caratere maximum par ligne dans le fichier lu : 3*400+400+1 = 1601 mais j'ai mis 1650 pour arrondir
#define SEP					"\t"					// Séparateur utilisé dans le fichier
#define PATH				"d:\\meteo.txt"		// Mets l'emplacement de ton fichier contenant les valeurs

int main(int argc, char* argv[])
{
FILE*	m_File;
int		i = 0;
int		j;
float	Tab[LMAX][CMAX];
char	szbuff[MAX_CHAR_PER_LINE];
char*	token;

// On initialise le tableau a -1
for(i=0;i<LMAX;i++)
{
for(j=0;j<CMAX;j++)
{
Tab[i][j] = -1;
}
}

// On réinitialise le compteur de ligne car i;a été incrémenté lors de l'iniatialisation
i = 0;

// On ouvre le fichier en lecture seule et en mode texte
m_File = fopen(PATH,"rt");

// On vérifie qu'il n'y ai pas eu d'erreur pendant l'ouverture du fichier
if(!m_File) return 1;

// On lit le fichier ligne a ligne et on stocke les valeurs dans un tableau d'entier
// La boucle while a l'avantage de permettre la lecture d'un fichier sans connaitre son nombre de ligne exact
// et nous évite donc de faire bugger le programme
// Le "feof" veut "End Of File". On lit donc jusuqu'à la fin du fichier
while(!feof(m_File) && i < LMAX)
{

j = 0;

// On récupere la ligne courante du fichier
fgets(szbuff,MAX_CHAR_PER_LINE,m_File);

// On decoupe la ligne selon le charactere de séparation SEP (" ")
token = strtok(szbuff,SEP);

// On lit les éléments découpés un à un et on les stocke dans le tableau Tab
while(token != NULL && j < CMAX)
{
// On stocke la valeur lue dans le tableau
Tab[i][j] = atof(token);
// On lit l'element suivant retourner par strtok
token = strtok(NULL,SEP);
// On incremente le compteur des ordonnées
j++;
}

// On incrémente le compteur des abscisses
i++;
}

// On affiche le tableau pour etre sur que tout s'est bien passé... Le \t correspond au caractere tabulation
for(int x=0;x<i;x++)
{
for(int y=0;y<j;y++)
{
printf("%f\t",Tab[x][y]);
}
printf("\n");
}

return 0;

}


A++ et bonne continuation....

Samir
0
rundish Messages postés 14 Date d'inscription vendredi 21 mai 2004 Statut Membre Dernière intervention 21 mai 2004
21 mai 2004 à 14:48
merci à tout les deux.
je n'avais pas fait d'erreur Samir, mais je pense que mon fichiers txt n'est pas bien formaté. je vais voir de ce côté la.
encore merci
0
rundish Messages postés 14 Date d'inscription vendredi 21 mai 2004 Statut Membre Dernière intervention 21 mai 2004
21 mai 2004 à 15:40
cela vient bien de mon fichier txt. avec ton meteo.txt cela marche bien, mais avec le miens, j'ai juste la première colone
0
rundish Messages postés 14 Date d'inscription vendredi 21 mai 2004 Statut Membre Dernière intervention 21 mai 2004
21 mai 2004 à 16:40
ca y est, cela marche. cela venai de mon fichier txt.
je ne sais pas comment j'ai fait par la suite, mais c'est bon.
encore mercià vous
bon week-end
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
21 mai 2004 à 19:45
Ya pas de quoi rundish.
Bon week end a toi aussi.

A++ et bonne continuation...

Samir
0
Rejoignez-nous