Récupérer une matrice à partir d'un fichier

Signaler
Messages postés
96
Date d'inscription
mercredi 23 novembre 2005
Statut
Membre
Dernière intervention
7 mars 2011
-
Messages postés
3
Date d'inscription
mercredi 11 mai 2011
Statut
Membre
Dernière intervention
20 mars 2013
-
Bonjour,
je chercher a récupérer une matrice a partir d'un fichier.
1- la taille est variable (nombre de lignes et colonnes)
2- les données sont organisé de la manière suivante:
401 402 405
302 154 142
145 145 152
Bien sur la taille est variable, le souci vient surtout du nombre de colonnes et pas les lignes(car c simple la lecture par ligne) c surtout récupéré tout les données d'une ligne.
Je suis ouvert a tout: JAVA/FORTRAN/CPP.
Merci d'avance

9 réponses

Messages postés
238
Date d'inscription
lundi 2 mars 2009
Statut
Membre
Dernière intervention
29 septembre 2011

Salut,
Quelques questions:
Dans un fichier, tu peux avoir 2,3,...etc de colonnes?
Le nombre de colonnes varient d'une ligne à l'autre ?




The possible meet the impossible to become the possimpible !!
Messages postés
96
Date d'inscription
mercredi 23 novembre 2005
Statut
Membre
Dernière intervention
7 mars 2011

Salut,
merci pour ta réponse et pour l'intérêt. dans mon cas ya toujours le même nombre de colonnes.
C'est une matrice normal.
merci
Messages postés
238
Date d'inscription
lundi 2 mars 2009
Statut
Membre
Dernière intervention
29 septembre 2011

D'accord, donc nous avons le même nombre de colonnes dans un fichier. Maintenant ce nombre peut varier d'un fichier à un autre, exact?

Tu as la possibilité d'utiliser les "list" en JAVA ou les tableaux dynamiques (allocation dynamique = malloc... )en C/C++.

The possible meet the impossible to become the possimpible !!
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
Salut,

JAVA/FORTRAN/CPP ?

Et le C, ça marche aussi ?

Voilà deux fonctions très lentes à l'exécution permettent de récupérer le nombre de ligne et de colonnes.

En Maths, M[I, J] = valeur à la ième ligne de la jième colonne.
Donc M est un tableau de pointeurs de la taille du nombre de ligne.
Et chaque M[I] est un tableau d'entier de la taille du nombre de colonne.

Pour allouer la matrice, il est courant de voir un malloc puis une boucle sur des malloc. C'est nul (Du moins tant que la matrice n'est pas trop grande).

Il vaut mieux faire un seul malloc (malloc, c'est lent). On va donc essayer de s'inspirer du snippet de SAKingdom.

Assez obscure son histoire... On va essayer de rendre ça un peu plus lisible, bien qu'on perdra certainement en vitesse.

Pareil, pour la lecture depuis le fichier, j'ai pas optimisé non plus...

Très lent tout ça ! Mais bon :
1) Charger tout le fichier en mémoire -> pas top si le fichier est gros
2 Faire des accès disques avec des jolis tampons, ça prend pas deux minutes à coder...

#include <stdio.h>
#include <stdlib.h>

/**
 * Renvoie le nombre de colonnes dans la première ligne
 *
 * Les colonnes sont séparées par des espaces. Il peut y avoir des
 * espaces avant et après les colonnes. Le nombre d'espaces n'a pas
 * d'importance. Ne gère pas les tabulations.
 */
int CountColumns(FILE* lpFile)
{
  int nChar;
  long nPreviousPos;
  int bTokenFound;
  int nResult;

  nResult = 0;
  bTokenFound = 0;
  nPreviousPos = ftell(lpFile);
  do
  {
    nChar = fgetc(lpFile);
    if (nChar == ' ')
    {
      if (bTokenFound)
      {
        nResult++;
        bTokenFound = 0;
      }
    }
    else if ((nChar != EOF) && (nChar != '\n'))
      bTokenFound = 1;
  }
  while ((nChar != EOF) && (nChar != '\n'));
  if (bTokenFound) nResult++;

  fseek(lpFile, nPreviousPos, SEEK_SET);
  return nResult;
}

/**
 * Compte le nombre de lignes d'un fichier
 *
 * Ne compte pas l'éventuelle ligne vide en fin de fichier.
 */
int CountLines(FILE* lpFile)
{
  int nChar;
  long nPreviousPos;
  int nPreviousChar;
  int nResult;

  nResult = 0;
  nChar = -1;
  nPreviousPos = ftell(lpFile);
  do
  {
    nPreviousChar = nChar;
    nChar = fgetc(lpFile);
    if (nChar == '\n') nResult++;
  }
  while (nChar != EOF);
  if ((nPreviousChar != '\n') && (nPreviousChar != -1))
    nResult++;

  fseek(lpFile, nPreviousPos, SEEK_SET);
  return nResult;
}

/**
 * Alloue une matrice de la dimension spécifiée
 */
int **AllocMatrix(int nLines, int nColumns)
{
  int** lpResult;
  char* lpColumnsOffset;
  int nI;
    
  lpResult = (int**)malloc(nLines * sizeof(int*) + nLines * nColumns * sizeof(int));
  lpColumnsOffset = (char*)lpResult + nLines * sizeof(int*);
  for (nI = 0; nI < nLines; nI++)
    lpResult[nI] = (int*)(lpColumnsOffset + nI * nColumns * sizeof(int));

  return lpResult;
}

/**
 * Charge la matrice dans le fichier dans la matrice en mémoire
 */
void LoadMatrix(FILE* lpFile, int **lpMatrix, int nLines, int nColumns)
{
  int nI, nJ;

  for (nI = 0; nI < nLines; nI++)
    for (nJ = 0; nJ < nColumns; nJ++)
      fscanf(lpFile, "%d", &lpMatrix[nI][nJ]); 
}

/**
 * Affiche la matrice
 */
void DisplayMatrix(int **lpMatrix, int nLines, int nColumns)
{
  int nI, nJ;

  for (nI = 0; nI < nLines; nI++)
  {
    for (nJ = 0; nJ < nColumns; nJ++)
      printf("%d ", lpMatrix[nI][nJ]);
    printf("\n");
  }
}

int main()
{
  int** lpMatrix;
  int nColumns;
  int nLines;
  FILE* lpFile;
  int nResult;

  lpFile = fopen("test.txt", "r");
  if (! lpFile)
  {
    printf("Impossible d'ouvrir le fichier\n");
    nResult = 1;
  }
  else
  {
    nColumns = CountColumns(lpFile);
    nLines = CountLines(lpFile);
    printf("Nombre de colonnes : %d\n", nColumns);
    printf("Nombre de lignes   : %d\n", nLines);
    lpMatrix = AllocMatrix(nLines, nColumns);
    LoadMatrix(lpFile, lpMatrix, nLines, nColumns);
    DisplayMatrix(lpMatrix, nLines, nColumns);
    free(lpMatrix);
    fclose(lpFile);
    nResult = 0;
  }
  return nResult;
}

Messages postés
96
Date d'inscription
mercredi 23 novembre 2005
Statut
Membre
Dernière intervention
7 mars 2011

Merci mec,
g déja résolu mon prob. c'est a voir aussi. en tt cas merci c cool
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
Pas de style SMS s'il te plait !

(Woah, c'est l'invasion en ce moment...)
Messages postés
3
Date d'inscription
mercredi 11 mai 2011
Statut
Membre
Dernière intervention
20 mars 2013

bonjour,
comment il faut modifier le code de rt15 afin que ce code fait ces étapes:
-récupérer le premier entier de fichier dans une variable de type entier
-récupérer les autres entiers dans une matrice

merci d'avance
Messages postés
96
Date d'inscription
mercredi 23 novembre 2005
Statut
Membre
Dernière intervention
7 mars 2011

Bonjour,
En fait c'est plus simple que ce qu'on croit.il faut faire un parcours ligne par ligne et réserver de la mémoire au fur et a mesure qu'on balaye le fichier.
Pour ton cas récupérer l'entier grâce à un indice. quand ton indice vaudra 1 c'est ton entier que tu extrais quand c'est plus de deux tu suivra à l'occasion tes formats de données.
Le code est bien mais il y a beaucoup de parcours de fichiers inutiles.
Bon courage
Messages postés
3
Date d'inscription
mercredi 11 mai 2011
Statut
Membre
Dernière intervention
20 mars 2013

svp je n'ai pas compris, quelqu'un peut m'aider en me donner un code complet détaillé