IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

créer un tableau de int à partir d'un fichier texte


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2010
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 21
    Points : 11
    Points
    11
    Par défaut créer un tableau de int à partir d'un fichier texte
    j'ai un fichier texte de la forme suivante :
    -3 36 7 0
    -3 -42 -48 0
    -49 -47 -41 0
    8 -40 17 0
    -21 -31 -39 0
    36 -22 49 0
    j'aimerais stocker ces valeurs sous forme d'un tableau de int à 2 dimensions

    le probleme c'est que je connais le nombre de lignes de ce tableau mais le nombre de valeurs par ligne peut varier et je ne peux donc pas donner une taille fixe pour le nombre de colonnes de mon tableau

    comment pourrai-je faire ??

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 23
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par guigz57 Voir le message
    j'ai un fichier texte de la forme suivante :
    -3 36 7 0
    -3 -42 -48 0
    -49 -47 -41 0
    8 -40 17 0
    -21 -31 -39 0
    36 -22 49 0
    j'aimerais stocker ces valeurs sous forme d'un tableau de int à 2 dimensions

    le probleme c'est que je connais le nombre de lignes de ce tableau mais le nombre de valeurs par ligne peut varier et je ne peux donc pas donner une taille fixe pour le nombre de colonnes de mon tableau

    comment pourrai-je faire ??
    La methode faineante, simple mais laissant des vides en memoire:

    utiliser quand meme un tableau de taille fixe en prenant la taille maximale de ligne comme largeur.

    L'autre méthode :
    typedef struct ligne{
    unsigned int size;
    int * line;
    } LIGNE;

    LIGNE tableau[nblignes];

    et ensuite lire les valeurs en stockant une ligne a la fois dans un tableau de taille suffisante, puis quand une ligne est pleine renseigner la valeur size , faire tableau[i].line=malloc(size*sizeof(int)); et recopier les valeurs.

  3. #3
    Membre à l'essai
    Inscrit en
    Mars 2010
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 21
    Points : 11
    Points
    11
    Par défaut
    ok merci j'y vois deja un peu plus clair

    mais j'ai quand meme du mal à voir comment est-ce que j'instancie mon tableau de int dans lequel je vais recopier toutes les valeurs ...

  4. #4
    Membre à l'essai
    Inscrit en
    Mars 2010
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 21
    Points : 11
    Points
    11
    Par défaut
    voila ce que j'ai reussi à faire pour l'instant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    int tab[nbLignes][3];
    	int i = 1;
     
    	while(fgets(chaine, BUFSIZ, f) != NULL && i<10)
    	{
    		char *pointeur;
    		char *separateur = { " " }; // Le séparateur
    		int taille = 1;
    		int n;
     
    		pointeur = strtok(chaine, separateur);
    		//printf ("Mot de la phrase numero : %d %s\n",taille, pointeur);
     
    		sscanf(pointeur, "%d", &n);
    		tab[i][taille] = n;
    		printf("i = %d et j = %d\n",i,taille);
    		printf("%d\n",tab[i][taille]);
     
    		while( pointeur != NULL )
    		{
    			// Cherche les autres separateur
    			pointeur = strtok( NULL, separateur );
     
    			if ( pointeur != NULL )
    			{
    				taille++; // increment du nombre de mot
    				//printf ("Mot de la phrase numero : %d %s\n",taille, pointeur);
    				sscanf(pointeur, "%d", &n);
    				tab[i][taille] = n;
    				printf("i = %d et j = %d\n",i,taille);
    				printf("%d\n",tab[i][taille]);				
    			}
    		}
    		i++;
    	}
     
    	printf("\n\n\n");
    	printf("%d\n",tab[8][2]);
    	printf("%d\n",tab[8][3]);
    	printf("%d		%d\n",tab[8][4],tab[9][1]);
    	printf("%d		%d\n",tab[8][5],tab[9][2]);
    	if(tab[8][4] == tab[9][1])
    		printf("meme objet\n");
    	else
    		printf("objets differents\n");
    je crée mon tableau dont je connais le nombre de lignes mais pas le nombre de colonnes puisque cela varie selon les lignes
    (ici pour pouvoir continuer je l'ai mis à 3...)

    si quelqu'un pourrait me reexpliquer je suis preneur !!

    et je me suis apercu que par exemple tab[8][4] = tab[9][1]...

    d'où vient cette erreur ??

  5. #5
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    On peut suivre le schéma suivant si tu connais a priori le nombre de lignes N :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    -1 Créer un tableau de pointeurs int * tab[N]
    -2 tant qu'il y a des données à lire :
    -2.1 Lire la ligne N° i dans un buffer (fgets)
    -2.2 Compter le nombre d'entiers M dans le buffer (à écrire, voir plus bas)
    -2.3 Allouer de la mémoire pour M entiers (et vérifier que l'allocation a réussi) :
      tab[i] = malloc(M*sizeof(int))
    -2.4 Pour chaque entier dans la ligne, le ranger dans le tableau tab[i][j] = .... (j=0..M-1)
    Le problème est d'extraire de la ligne les entiers les uns derrière les autres ce qui n'est pas si facile car cela dépend du contenu de la ligne.

    Je te propose ce code qui extrait le premier entier trouvé dans la chaine commençant en *t en ignorant tout les caractères qui le précèdent. Les separateurs des nombres sont quelconques. Il place dans *t l'adresse du caractère suivant le nombre extrait et renvoie le nombre, ou NULL si la chaine ne contient pas de nombres et renvoie 0.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    int getInt( char** t)
    {
      char * deb = *t;
      int valeur = 0;
      if(deb != NULL && *deb == '\0')deb = NULL;
      if(deb != NULL)
      {
         int continuer = 0;
         do
          {
            char * next;
            valeur = strtol(deb, &next,10);
            continuer = deb == next;
            if(continuer)
            {
              deb++;
              continuer = *deb != '\0';
              if(!continuer) deb = NULL;
            }
            else deb = next;
          }while(continuer);
      }
      *t = deb;
      return valeur;
    }
    On peut l'utiliser pour compter le nombre d'entiers dans la chaine t :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int countInt(char *t)
    {
      int count = 0;
      char * p = t;
      while(p != NULL)
      {
         getInt(&p);
         if(p!= NULL) count++;
      }
      return count;
    }
    On aura alors quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    int * tab[N];
    int i;
    for(i = 0 ; fgets(chaine, BUFSIZ, f) != NULL && i < 9; i++)
    {
       int j;   
       int count = countInt(chaine);
       if(count !=0)
       {
          tab[i] = malloc(count*sizeof(int));
          if(tab[i] != NULL)
          {
            char * p = chaine;
            for(j=0; j<count; j++) tab[i][j] = getInt(&p);
          }
          else {/*erreur d'allocation */}
       }
       else tab[i] = NULL;
    }

    et je me suis apercu que par exemple tab[8][4] = tab[9][1]...
    Les données sont rangées consécutivement en mémoire (avec tab déclaré comme int tab[?][3]) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     position   indices i  j  dans tab[i][j] 
        0               0  0
        1               0  1
        2               0  2
        3               1  0
        4               1  1
        5               1  2
    ...
    Et on peut obtenir la position de tab[i][j] par pos(i,j) = 3*i+j
    Or 3*8+4 = 3*9+1 ce qui fait qu'ils correspondent à la même position en mémoire, donc au même élément.

  6. #6
    Membre à l'essai
    Inscrit en
    Mars 2010
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 21
    Points : 11
    Points
    11
    Par défaut
    je vais regarder ça
    en tout cas merci beaucoup diogene de t'etre penché comme ça sur mon sujet, ton aide va m'etre precieuse

    merci beaucoup je regarde tout de suite ce que ça donne dans mon programme

Discussions similaires

  1. Réponses: 12
    Dernier message: 01/12/2014, 22h40
  2. Créer un tableau à partir d'un fichier texte
    Par jchampen dans le forum Langage
    Réponses: 9
    Dernier message: 04/11/2008, 08h34
  3. Réponses: 6
    Dernier message: 01/05/2007, 23h16
  4. Réponses: 2
    Dernier message: 15/12/2006, 14h22
  5. [Info]Créer un tableau de String à partir d'autres String
    Par Nasky dans le forum Collection et Stream
    Réponses: 21
    Dernier message: 06/07/2005, 11h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo