copier une valeur d'un fichier à une variable
Répondre à la discussion
Affichage des résultats 1 à 14 sur 14

copier une valeur d'un fichier à une variable



  1. #1
    invite8b421ec7

    Question copier une valeur d'un fichier à une variable


    ------

    Bonjour,

    Comment fait-on pour stocker des données, lues à partir d'un fichier text, vers une matrice. Supposons que j'ai un fichier donnes.txt de la forme suivante:
    0 1 2 3
    12 5 6
    6 7 8
    9
    11 10

    Comment lui demander de copier dans la première ligne à la première case 0, deuxième case 1,..., à la deuxième ligne première case 12 ,etc.

    J'ai fais le programme ci-dessous. Pourriez-vous SVP y jetter un coup d'oeil et me le corriger?
    Merci.
    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define N 10 //number of lines
    int main(int argc, char *argv[])
    {
    	int **matrix;
    	matrix=malloc(N * sizeof(int*));
    	if(matrix==NULL)
    	{
                     printf("Can't allocate memory for matrix\n have to exit!");
                     exit(1);
    	}
                for(i=0;i<N;i++)
               {
                   matrix[i]=malloc(N * sizeof(int));
     
                  if(matrix[i]==NULL)
                 {
                   printf("Can't allocate memory for matrix\n have to exit!\n");
                   exit(1);
                }
            }
           j=0; //compteur column
           int caractereActuel = 0;
           fichier = fopen("test.txt", "r");
           caractereActuel = fgetc(fichier);
           while (caractereActuel != EOF) // On continue tant que fgetc n'a pas     retourné EOF (fin de fichier)
    	{
    	   for(i=0;i<N;i++)//i : compteur ligne
    	   {
     
     
                       matrix[i][j]= caractereActuel;
                       caractereActuel = fgetc(fichier);
                       j++;
    	      }
    	  }
     
    	}
     
                 for(i=0;i<N;i++)
    	{
    	     for(j=i+1;j<N;j++)
    	     {
                          printf("%d",matrix[i][j]); // On affiche le caractère stocké dans caractereActuel
     
    	      }
    	 }
    	fclose(fichier);
    	for(i=0;i<N;i++)
               {
                  free(matrix[i]);
               }
               free(matrix);
               return 0;
         }
    }

    -----

  2. #2
    invite4492c379

    Re : copier une valeur d'un fichier à une variable

    Hello,

    Je suppose que la matrice qui va contenir les données a une taille fixe et qu'elle n'est pas déterminée en fonction des données dans le fichier. Je suppose également que les cellules non renseignées dans le fichier seront des cellules qui vont contenir la valeur 0. Est-ce bien cela ?

    Ou au contraire souhaites-tu implémenter une matrice creuse de taille dynamique s'adaptant automatiquement aux nombre de données dans le fichier ?

  3. #3
    invite8b421ec7

    Re : copier une valeur d'un fichier à une variable

    Merci pour votre réponse.
    Je suis plutôt dans le deuxième cas.
    Voici mon fichier .text
    Merci de votre aide.
     Cliquez pour afficher
    Dernière modification par JPL ; 26/02/2012 à 00h01. Motif: Spoiler

  4. #4
    invite4492c379

    Re : copier une valeur d'un fichier à une variable

    Citation Envoyé par celine2 Voir le message
    Merci pour votre réponse.
    Je suis dans le deuxième cas.
    Voici mon fichier .text
    Merci de votre aide.
    Dans ce cas, au vu du fichier, le plus simple est d'implémenter une liste de liste, surtout si tu ne connais ni le nombre de lignes ni le nombre de colonnes.
    La lecture dans le fichier peut-être un peut fastidieuse aussi :
    stocker une ligne entière dans un buffer (char*)
    en séparer les nombres avec des strtok/atoi successifs pour créer les noeuds successifs de tes listes

    La liste de liste peut éventuellement être implémentée par un tableau dynamique (via malloc/realloc) de listes (il faudra penser à stocker la taille du tableau), voire un tableau dynamique de tableaux dynamiques (attention à bien stocker toutes les tailles de tous les tableaux).

    Quel est ton niveau ? Est-ce dans le cadre d'un exercice ?

  5. A voir en vidéo sur Futura
  6. #5
    invite4492c379

    Re : copier une valeur d'un fichier à une variable

    Quoique au vu du fichier ... tu cherches toutes les r-combinaisons possibles de 10 éléments ?
    Il serait plus simple de les générer lexicographiquement. Il y a des algo très performants pour ça.

  7. #6
    invite8b421ec7

    Re : copier une valeur d'un fichier à une variable

    Merci pour ta réponse.
    Je suis novice en C.
    Pourrais-tu STP m'expliquer un peu plus les étapes de la méthode d'utilisation d'un tableau dynamique à 2D et comment allouer et reallouer de l'espace mémoire? Merci.

  8. #7
    invite4492c379

    Re : copier une valeur d'un fichier à une variable

    Ton fichier c'est un exemple bidon ou le fichier que tu dois lire ?

  9. #8
    invite8b421ec7

    Re : copier une valeur d'un fichier à une variable

    Citation Envoyé par photon57 Voir le message
    Quoique au vu du fichier ... tu cherches toutes les r-combinaisons possibles de 10 éléments ?
    Il serait plus simple de les générer lexicographiquement. Il y a des algo très performants pour ça.
    Exactement. J'ai énumérer toutes les combinaisons possibles de 10 éléments à l'aide d'un algorithme récursif et je les stocker dans un fichier. Maintenant je souhaite les cpier dans une matrice pour pouvoir effectuer quelques opérations.
    Si vous auriez une idée meilleure, je suis preuneuse.
    Merci

  10. #9
    invite4492c379

    Re : copier une valeur d'un fichier à une variable

    Ça dépend des opérations, que veux-tu en faire ?

  11. #10
    invite8b421ec7

    Re : copier une valeur d'un fichier à une variable

    Citation Envoyé par photon57 Voir le message
    Ton fichier c'est un exemple bidon ou le fichier que tu dois lire ?
    C'est le bon fichier.

  12. #11
    invite8b421ec7

    Re : copier une valeur d'un fichier à une variable

    Citation Envoyé par photon57 Voir le message
    Ça dépend des opérations, que veux-tu en faire ?
    Des sommes des valeurs d'une ligne, comparaisons entre les valeurs etc

  13. #12
    invite4492c379

    Re : copier une valeur d'un fichier à une variable

    Si je comprends bien, tu génères toutes les r-combinaisons possibles, tu les écris dans un fichier (au format texte) pour finalement remplir un tableau ?
    Pourquoi passer par un fichier ? pourquoi ne pas remplir directement le tableau ?

  14. #13
    invite8b421ec7

    Re : copier une valeur d'un fichier à une variable

    Citation Envoyé par photon57 Voir le message
    Si je comprends bien, tu génères toutes les r-combinaisons possibles, tu les écrits dans un fichier (au format texte) pour finalement remplir un tableau ?
    Pourquoi passer par un fichier ? pourquoi ne pas remplir directement le tableau ?
    Ceci dit je ne sais pas à quelle moment il faut le faire.
    Voici mon algorithme qui calcule les k combinaisons.
    Merci de votre aide.
    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define N 10 //number of elements
    void combinaisons(FILE *fichier, int n, int p, int k, int *L, int *t, int r)
    {
    	int i, j, j1;
    	int *t2 = malloc(n*sizeof(int)); 
    	if(r<p-k) return;
    	if(k==p)
    	{
    		for(i=0;i<p;i++)
    		{
    //			printf("%d ", L[i] );
    			fprintf(fichier, "%d ",L[i]);
    		}
    //		printf("\n");
    		fprintf(fichier, "\n"); 
    		return;
    	}
    
    	for(i=0;i<r;i++)
    	{
    		L[k] = t[i];
    		for(j=i+1, j1=0;j<r;j++, j1++)
    		{
    			t2[j1] = t[j];
    		}
    		combinaisons(fichier, n, p, k+1, L, t2, j1);
    	}
    	free(t2); 
    }
    
    
    
    int main(int argc, char *argv[])
    {
    //	int n = 5, p = 2;
    //	int L[5], t[5], i;
    	int L[N], t[N], i,j,p;
    	FILE *fichier;
    
    	for(i=0;i<N;i++)
    		t[i] = i;
    
    	fichier=fopen("Combinations.txt","w");
    	if(fichier==NULL)
    	{
    		printf("Failed to open  Combinations file, quitting!\n");
    		exit(1);
    	}
    	for(p=2;p<N;p++)
    	combinaisons(fichier, N, p, 0, L, t, N);
    
    	fclose(fichier);
    	
    	return 0;
    }

  15. #14
    invite4492c379

    Re : copier une valeur d'un fichier à une variable

    Re-,

    Bon, dans ton énumération tu commences avec les combinaisons de longueur 2, tu skippes celles de longueur 1 et 0. Ton tableau va donc contenir 2N-N-1 lignes, la plus grandes de ces lignes va contenir N nombres. Dans un premier temps nous allons partir sur l'utilisation d'un tableau plein de 2N-N-1 lignes et N+1 colonnes. Pourquoi N+1 colonnes ? Simplement car la première colonne va contenir le nombre de nombres utilisés par la combinaison.
    Cette solution est inutilisable pour de grandes valeurs de N, en effet un entier étant généralement codé sur 4 octets le tableau prendra 4*(2N-N-1)(N+1) octets en mémoire. Pour N=10 on obtient 44 kO (on va dire raisonnable), pour N=20 on obtient 84 MO (on va dire plutôt gros), pour N=30 124 GO (carrément impraticable).

    Maintenant comment faire ? Ça reste simple, mais on ne va pas faire propre pour modifier ton code un minimum.
    On commence par déclarer un tableau en variable globale :
    Code:
    int Comb[(1<<N)-N-1][N+1];
    1<<N est un «raccourci» pour calculer 2N en entier.

    Au lieu d'écrire p entiers dans le fichier :

    Code:
      for(i=0;i<p;i++)
      {
    //   printf("%d ", L[i] );
       fprintf(fichier, "%d ",L[i]);
      }
    on va écrire à la bonne ligne dans le tableau l'entier p dans la case 0, puis toujours avec un boucle les p entier dans les cases 1 à p+1. Mais comment savoir à quelle ligne écrire ? On va de nouveau faire sale. On va déclarer une variable globale i_Comb que l'on initialise directement à 0 :
    Code:
    int i_Comb=0;
    ta boucle va se transformer en :
    Code:
      // on écrit à la ligne i_Comb du tableau Comb
      // la première case contient le nombre d'éléments de la combinaison
      Comb[i_Comb][0]=p
      for(i=0;i<p;i++)
      {
      // Avant : 
      //printf("%d ", L[i] );
      //fprintf(fichier, "%d ",L[i]);
      // Après :
      // On écrit dans la case i+1 l'élément de la combinaison :
        Comb[i_Comb][i+1]=L[i];
      }
      // On a tout écrit, il ne faut pas oublier d'incrémenter i_Comb pour la prochaine écriture
      i_Comb=i_Comb+1;
    à la fin i_Comb contiendra le nombre de lignes du tableau Comb.

    Pour l'afficher tu pourras l'utiliser ainsi :
    Code:
      for(i=0;i<i_Comb;i++) {
        for(j=1;j<=Comb[i][0];j++)
          printf("%d ", Comb[i][j]);
        printf("\n");
      }

    ATTENTION : Ce code n'est pas propre (au sens usuel du terme), et je ne l'ai pas testé.

    Si tu en as envie on pourra le rendre un peu plus propre, voire carrément l'améliorer surtout si tu peux m'expliquer ce que tu comptes en faire.


    REMARQUE : Une technique de sioux (à n'employer que dans des circonstances exceptionnelles)

    tu aurais pu commencer par écrire un header dans ton fichier :
    Code:
    int Comb[][]={
    ensuite au lieu de faire un printf pour y écrire par exemple
    Code:
    0 1 2 3
    plutôt y écrire
    Code:
    {4, 0, 1, 2, 3},
    tout à la fin tu y écris
    Code:
    };
    pour obtenir un fichier que tu aurais pu compiler ... tu aurais généré du code (un programme qui écrit un programme).

Discussions similaires

  1. Extraire une page d'un fichier PDF
    Par michel5002 dans le forum Logiciel - Software - Open Source
    Réponses: 39
    Dernier message: 03/02/2014, 12h07
  2. modifier un fichier une valeur d'un fichier .hex
    Par kletus dans le forum Électronique
    Réponses: 0
    Dernier message: 19/02/2012, 17h18
  3. Tester si une valeur existe dans un fichier
    Par invite074048f2 dans le forum Programmation et langages, Algorithmique
    Réponses: 7
    Dernier message: 13/01/2012, 22h43
  4. Déclarer une variable pr faire appel à valeur de port
    Par Platipu$ dans le forum Électronique
    Réponses: 5
    Dernier message: 26/07/2011, 20h53
  5. proba : loi d'un couple avec une variable discrète et une continue
    Par invite0b6e1116 dans le forum Mathématiques du supérieur
    Réponses: 6
    Dernier message: 05/12/2009, 22h28