Copier les colonnes d'un fichier texte dans 3 tableaux différents en C

Discutez d'informatique ici !
sa7roura88
Messages: 3
Enregistré le: 28 Déc 2015, 15:00

Copier les colonnes d'un fichier texte dans 3 tableaux différents en C

par sa7roura88 » 28 Déc 2015, 15:08

Bonjour,

J'ai un fichier .txt de la forme suivante 108 -56 255
108 -56 251
24 54 251
24 54 252
21 -21 254
21 -21 252
146 -28 254
146 -28 252
2 84 255
2 84 255
2 84 255
17 20 251
-111 -44 253
-114 -45 254
-99 -52 254
-109 -44 255
-110 -46 252
-105 -48 254

Je veux copier chaque colonne dans le tableau associé et voici le code que j'ai écrit pour un 1er tableau ax

#include
#include

int main()
{
int i;
int length=0;
int c;
int ax[18];
FILE *fichier;

// Ouverture d'un fichier et détermination de sa taille
fichier =fopen("data.txt","r");
if(fichier!=NULL){
while ((c=getc(fichier))!=EOF)
{ if (c=='\n')
length++;
}
}
rewind(fichier);

// copie de la 1ère colonne dans un tableau
for (i=0;i {fscanf(fichier,"%d\n",&ax[i]);
if (&ax[i]=="\n")
{printf("%d\n",ax[i]);
fclose(fichier);}
}
return length;
}

Mais je n'ai aucun affichage de la console et je ne trouve pas le problème.
Vos suggestions me seraient d'une grande aide pour corriger ce programme en C.



joel76
Membre Relatif
Messages: 230
Enregistré le: 11 Fév 2013, 16:31

par joel76 » 28 Déc 2015, 17:41

Plein d'erreurs dans ce code !

Code: Tout sélectionner
int main()
{
   int i;
   int length=0;
   int c;
   int ax[18];
   FILE *fichier;

   // Ouverture d'un fichier et détermination de sa taille
   fichier =fopen("data.txt","r");
   if (fichier!=NULL)
   {
      while ((c=getc(fichier))!=EOF)
      {
         if (c=='\n')
            length++;
      }
   }
   rewind(fichier);

   // copie de la 1ère colonne dans un tableau
   for (i=0;i<length;i++)
   {
      fscanf(fichier,"%d\n",&ax[i]);
      if (&ax[i]=="\n")
      {
         printf("%d\n",ax[i]);
         fclose(fichier);
      }
   }
   return length;
}
Si l'ouverture du fichier est correcte, tu calcules la longueur d'une ligne (on peut aller plus vite) puis tu refermes le bloc du if, ce qui fait que tu continues à travailler sur le fichier même si l'ouverture à échouer !
Tu utilises mal la longueur de la ligne, pour lire les trois nombres, il faut faire 3 fscanf.
Le test &ax[i] == "\n" n'a aucun sens et échouera toujours.
Tu ne fermes le fichier qu'a un seul endroit (d'ailleurs ici jamais ...) et tu retournes alors qu'ne pricipe on retourne 0 ou mieux EXIT_SUCCESS ou EXIT_FAILURE.
Que veux-tu faire exactement, afficher la première ligne du fichier ?
Dans ce cas tu peux faire
Code: Tout sélectionner
int main(void)
{
   int ax[18];
   FILE *fichier;

   // Ouverture d'un fichier et détermination de sa taille
   fichier =fopen("data.txt","r");
   if (fichier!=NULL)
   {
      fscanf(fichier,"%d %d %d\n",&ax[0], &ax[1], &ax[2]);
      printf("%d %d %d\n",ax[0], ax[1], ax[2]);
      fclose(fichier);
   }
   return 0;
}


danyL
Membre Rationnel
Messages: 681
Enregistré le: 03 Jan 2015, 14:29

par danyL » 28 Déc 2015, 20:01

pour debugguer ton code tu devrais afficher la valeur de length obtenue, correspond-elle bien à la taille de ton fichier ? ou est elle nulle ?

pour lire un fichier ligne par ligne tu peux aussi utiliser la fonction fgets()

a priori il faut incrémenter length si la variable c est différente de \n et pas si elle est égale
de meme pour le test sur ax[i]


sinon pour recuperer la taille d'un fichier il existe des fonctions comme fstat
ttp://gdw.free.fr/linux-magazine/fr/c-17.html

struct stat infos;
// descripteur : fichier
fstat (descripteur, &infos);
printf ("Taille= %d\n", infos.st_size);

joel76
Membre Relatif
Messages: 230
Enregistré le: 11 Fév 2013, 16:31

par joel76 » 28 Déc 2015, 21:54

Le P.O. calculait ici le nombre de lignes du fichier et non pas la taille de celui-ci.

danyL
Membre Rationnel
Messages: 681
Enregistré le: 03 Jan 2015, 14:29

par danyL » 28 Déc 2015, 22:11

joel76 a écrit:Le P.O. calculait ici le nombre de lignes du fichier et non pas la taille de celui-ci.

ah ok j'avais pas compris le but de la manœuvre, le commentaire (détermination de sa taille) et le nom de la variable length sont trompeurs
j'édite mon post

sa7roura88
Messages: 3
Enregistré le: 28 Déc 2015, 15:00

par sa7roura88 » 29 Déc 2015, 11:57

Merci pour votre aide si précieuse.
J'ai fait des tests d'ouverture mais j'ai juste affiché le fragment de code qui me pose problème.

En fait je veux afficher chaque ligne du fichier texte et extraire chaque valeur dans un tableau.
J'ai ajouté une boucle for pour les différentes lignes du fichier et voici le code corrigé pour afficher chaque ligne du fichier.
Voici le fragment de code que j'ai modifié.

int main(void)
{
int i;
int ax[18]; // tableau des valeurs x qui correspondent aux 1ère valeurs de chaque ligne
int ay[18];
int az[18];
FILE *fichier;

// Ouverture d'un fichier et détermination de sa taille
fichier =fopen("data.txt","r");
if (fichier!=NULL)
{
for (i=0;i<18;i++)
{fscanf(fichier,"%d %d %d\n",&ax[i], &ay[i], &az[i]);
printf("%d %d %d\n",ax[i], ay[i], az[i]);
fclose(fichier);}
}
return 0;
}

Merci pour votre aide à tous!


joel76 a écrit:Plein d'erreurs dans ce code !

Code: Tout sélectionner
int main()
{
   int i;
   int length=0;
   int c;
   int ax[18];
   FILE *fichier;

   // Ouverture d'un fichier et détermination de sa taille
   fichier =fopen("data.txt","r");
   if (fichier!=NULL)
   {
      while ((c=getc(fichier))!=EOF)
      {
         if (c=='\n')
            length++;
      }
   }
   rewind(fichier);

   // copie de la 1ère colonne dans un tableau
   for (i=0;i<length;i++)
   {
      fscanf(fichier,"%d\n",&ax[i]);
      if (&ax[i]=="\n")
      {
         printf("%d\n",ax[i]);
         fclose(fichier);
      }
   }
   return length;
}
Si l'ouverture du fichier est correcte, tu calcules la longueur d'une ligne (on peut aller plus vite) puis tu refermes le bloc du if, ce qui fait que tu continues à travailler sur le fichier même si l'ouverture à échouer !
Tu utilises mal la longueur de la ligne, pour lire les trois nombres, il faut faire 3 fscanf.
Le test &ax[i] == "\n" n'a aucun sens et échouera toujours.
Tu ne fermes le fichier qu'a un seul endroit (d'ailleurs ici jamais ...) et tu retournes alors qu'ne pricipe on retourne 0 ou mieux EXIT_SUCCESS ou EXIT_FAILURE.
Que veux-tu faire exactement, afficher la première ligne du fichier ?
Dans ce cas tu peux faire
Code: Tout sélectionner
int main(void)
{
   int ax[18];
   FILE *fichier;

   // Ouverture d'un fichier et détermination de sa taille
   fichier =fopen("data.txt","r");
   if (fichier!=NULL)
   {
      fscanf(fichier,"%d %d %d\n",&ax[0], &ax[1], &ax[2]);
      printf("%d %d %d\n",ax[0], ax[1], ax[2]);
      fclose(fichier);
   }
   return 0;
}


danyL
Membre Rationnel
Messages: 681
Enregistré le: 03 Jan 2015, 14:29

par danyL » 29 Déc 2015, 12:07

il faut déplacer fclose() après la boucle for
là tu fermes le fichier dès la première itération

sa7roura88
Messages: 3
Enregistré le: 28 Déc 2015, 15:00

par sa7roura88 » 29 Déc 2015, 12:15

Oui Merci.
C'est ce que j'ai fait pour afficher chaque ligne.
Voila le code final et corrigé.

int main(void)
{
int i;
int ax[18];
int ay[18];
int az[18];
FILE *fichier;

// Ouverture d'un fichier
fichier =fopen("data.txt","r");
if (fichier!=NULL)
{
for (i=0;i<18;i++)
{fscanf(fichier,"%d %d %d\n",&ax[i], &ay[i], &az[i]);
printf("%d %d %d\n",ax[i], ay[i], az[i]);}
fclose(fichier);
}
return 0;
}
danyL a écrit:il faut déplacer fclose() après la boucle for
là tu fermes le fichier dès la première itération

joel76
Membre Relatif
Messages: 230
Enregistré le: 11 Fév 2013, 16:31

par joel76 » 29 Déc 2015, 12:29

Et voici un code qui te permets de mémoriser dans un tableau les différentes valeurs du fichier.
Un probleme non résolu dans le code que je propose, est que je suppose le tableau assez grand (j'ai mis ici 100).
Comme tu as calculé dans ton premier poste, le nombre de lignes du fichier, on peut faire une allocation mémoire pour être sur que la taille du tableau sera assez grande. Je te laisse cherche comment !
Code: Tout sélectionner
nt main()
{
   int i,j;
   int ax[100][3];
   FILE *fichier;
   
   // Ouverture d'un fichier et détermination de sa taille
   fichier =fopen("data.txt","r");
   if (fichier!=NULL)
   {
      i = 0,
   
      while (fscanf(fichier,"%d %d %d\n",&ax[i][0], &ax[i][1], &ax[i][2]) == 3)
         i++;

      fclose(fichier);

      for(j = 0; j < i; j++)
         printf("%d %d %d\n",ax[j][0], ax[j][1], ax[j][2]);
   }   
   return 0;
}

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 13:00

par fatal_error » 29 Déc 2015, 21:09

on peut faire une allocation mémoire pour être sur que la taille du tableau sera assez grande

et de fait, il faut alors songer au problème d'une alloc trop grande...pour un tableau (pour commencer) :lol3:

ps:
afin d'être encore plus constructif. Voilà une alternative. En C.
Code: Tout sélectionner
#include
int main(){
    system("cut -d' ' -f1 inFile.txt > outFile_1.txt");
    system("cut -d' ' -f2 inFile.txt > outFile_2.txt");
    system("cut -d' ' -f3 inFile.txt > outFile_3.txt");
    return 0;
}
la vie est une fête :)

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 5 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite