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 :

lecture fichier texte


Sujet :

C

  1. #1
    Nouveau membre du Club
    Inscrit en
    Octobre 2007
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 29
    Points : 25
    Points
    25
    Par défaut lecture fichier texte
    Bonsoir,

    Comment fait-on pour stocker dans un tableau à deux dimensions les données lues à partir d'un fichier.text sachant que les lignes n'ont pas les même longeurs?
    Merci
    voici mon essai.Est ce correcte?Sinon pourquoi?
    P.S.je n'ai pas de compilateur sous la main



    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define N 10//on va supposer qu'au max la longueur d'une ligne est 10
    int main(int argc, char *argv[])
    {
    //	//copy in matrix
    	int matrix[N][N];
            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++)
    	   {
    	        for(j=i+1;j<N;j++)
    	        {
     
     
                       printf("%c", caractereActuel); // On affiche le caractère stocké dans caractereActuel
                       matrix[i][j]= caractereActuel;
                       caractereActuel = fgetc(fichier);
    	        }
    	   }
     
    	}
     
            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);
    	   return 0;
    }

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 136
    Points
    23 136
    Par défaut
    Pourquoi utiliser un int matrix[][] au lieu d'un char matrix[][] puisque tu stockes des chars?

    Ta méthode ne fonctionnera pas si tu as plus d'éléments que prévus et tu utilise inutilement de la mémoire si tu as moins d'éléments que prévus.

    Voici quelques pistes :

    Avec malloc tu peux allouer un espace mémoire.
    Avec realloc tu peux l'agrandir.
    Et avec free tu libère cet espace (à ne pas oublier)

    Un int[][] peut être remplacé par :
    un int ** et plusieurs int *

    Tu peux aussi consulter la FAQ pour plus de renseignements

  3. #3
    Nouveau membre du Club
    Inscrit en
    Octobre 2007
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 29
    Points : 25
    Points
    25
    Par défaut
    merci pour ta réponse. J'aimerais savoir comment stocker les données lues au fur et à mesure dans ma 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 ce que tu m'as demandé (allocation de mémoire, libération). Pourrais-tu STP y jetter un coup d'oeil et me le corriger?
    Merci encore
    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define N 10 //number of nodes
    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 colone
           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 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;
         }
    }

  4. #4
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 136
    Points
    23 136
    Par défaut
    J'ai regardé vite fait ton code, l'avantage du malloc est de pouvoir allouer un espace (pour 4 valeurs par exemple) et si on manque d'espace (plus de 4 valeurs) de réallouer avec realloc.

    Pour copier une valeur du fichier dans une variable, il faut partir du début du fichier (repositionnement avec fseek), à chaque '\n' on incrémente la ligne.
    Lorsqu'on est à la ligne désirée on lit les valeurs jusqu'à atteindre la valeur désirée.

    Pour copier une valeur d'un variable vers un fichier, tu n'as (à ma connaissance) pas d'autres choix que de créer un nouveau_fichier, copier le début du fichier, copier ta valeur, copier la fin du fichier, effacer le fichier et renommer ton nouveau_fichier.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Octobre 2007
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 29
    Points : 25
    Points
    25
    Par défaut
    Citation Envoyé par Neckara Voir le message
    J'ai regardé vite fait ton code, l'avantage du malloc est de pouvoir allouer un espace (pour 4 valeurs par exemple) et si on manque d'espace (plus de 4 valeurs) de réallouer avec realloc.

    Pour copier une valeur du fichier dans une variable, il faut partir du début du fichier (repositionnement avec fseek), à chaque '\n' on incrémente la ligne.
    Lorsqu'on est à la ligne désirée on lit les valeurs jusqu'à atteindre la valeur désirée.

    Pour copier une valeur d'un variable vers un fichier, tu n'as (à ma connaissance) pas d'autres choix que de créer un nouveau_fichier, copier le début du fichier, copier ta valeur, copier la fin du fichier, effacer le fichier et renommer ton nouveau_fichier.
    Merci. J'ai lu sur fseek() mais mais je n'ai pas bien compris comment l'utiliser
    J'appréhende la difficulté que ca représente

  6. #6
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 136
    Points
    23 136
    Par défaut
    fseek est très simple d'utilisation :

    Tu lui dis quel est le FILE * à utiliser (logique)
    Après tu lui dis si tu veux aller au début du fichier, à la fin du fichier ou rester où tu es.
    Tu est donc soit au début soit à la fin du fichier soit à la même position.

    A partir de cette nouvelle position, tu peux te déplacer de n caractères dans le fichier (ou de -n caractères = revenir en arrière si tu met un nombre négatif)

    Donc si tu recherche une tab[i][j] dans le fichier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    fseek(file, SEEK_DEBUT, 0); //je ne suis pas sûr de l'ordre et je ne me souvient pas de la vraie valeur de SEEK_DEBUT
    ligne = 0; colonne = 0;
    Tant que ligne != i
           ligne++;
           Tant que caractère lu != '\n' Fin Tant que
    Fin tant que
    Tant que colonne != j
           colonne++;
           Lire_une_valeur; //fscanf("%*d");
    Fin tant que
    fscanf("%d", &tab[i][j]);

  7. #7
    Nouveau membre du Club
    Inscrit en
    Octobre 2007
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 29
    Points : 25
    Points
    25
    Par défaut
    Citation Envoyé par Neckara Voir le message
    fseek est très simple d'utilisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    fseek(file, SEEK_DEBUT, 0); //je ne suis pas sûr de l'ordre et je ne me souvient pas de la vraie valeur de SEEK_DEBUT
    ligne = 0; colonne = 0;
    Tant que ligne != i
           ligne++;
           Tant que caractère lu != '\n' Fin Tant que
    Fin tant que
    Tant que colonne != j
           colonne++;
           Lire_une_valeur; //fscanf("%*d");
    Fin tant que
    fscanf("%d", &tab[i][j]);
    Merci!OK. Mais comment faire si le nombre de colone est variable?
    J'ai essayé de traduire ce que tu m'as proposé en C. Merci de me donner ton avis.
    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
    46
    47
    48
    49
    50
    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);
              }
         }
     
         int caractereLu = 0;
    	 fichier = fopen("test.txt", "r");
     
         fseek(fichier, 0, SEEK_SET);
         int ligne = 0; int colonne = 0;
         while (ligne != i)
         {
              ligne++;
               fscanf("%d", caractereLu);
     
              while(caractereLu !="\n"){
              }
         }
         while(colonne != j)
         {
              colonne++;
              fscanf("%d", caractereLu);
     
         }
     
     
     
    	fclose(fichier);
    	for(i=0;i<N;i++)
         {
              free(matrix[i]);
         }
        free(matrix);
    	return 0;
    }
    fichier donnees.txt
    0 1
    0 2
    0 3
    0 4
    0 5
    0 1 2
    0 1 3
    7 8 9
    0 1 2 3
    0 1 2 4
    0 1 2 5
    0 1 2 6
    0 1 2 3 4
    0 1 2 3 5
    0 1 2 3 4 5
    0 1 2 3 4 6

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par logo98 Voir le message
    Merci!OK. Mais comment faire si le nombre de colone est variable?
    2 solutions :

    1) tu parcoures le fichier 2 fois :

    la première, tu comptes le nombre de lignes NLI et le nombre max de colonnes NCO

    Tu alloues NLI fois NCO


    2) tu ne parcoures le fichier qu'une fois :

    tu lis une ligne , tu alloues 1 case
    tu parcoures la ligne, et à cahque élément tu alloues un nouvel élément


    La 1 te donne une matrice rectangulaire de taille fixe, la seconde de taille variable.

    En général, il vaut mieux faire 2, mais avec une liste chaînée plutôt que des allocations. Par contre, on perd un peu en mémoire puisqu'il faut des pointeurs sur les suivant et précédent. Si on veut le plus efficace en mémoire, il vaut mieux la solution 2, quiitte à parcourir 2 fois la ligne (une fois pour compter, l'autre fois pour remplir)

  9. #9
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2012
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 190
    Points : 380
    Points
    380
    Par défaut
    salut !

    j'ai pris un certain plaisir à étudier cette question : ça m'a permis de clarifier quelques points :

    les faiblesses de sscanf (la valeur retournée n'est pas d'une grande utilité) ne sont pas compensées par la richesse de strpbrk et de strtok (la valeur retournée est utile, mais la forme d'appel n'est pas compatible avec les formats) :
    il faut créer soit même les fonctions d'entrées formatées ;

    l'utilisation de (int ***) ne se fait pas sans douleur : en particulier une faute de (*p)[i] = i mal écrit *p[i] = i ...
    je ne suis pas près de refaire de la frappe au kilomètre dans ce contexte.

    A+

  10. #10
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par anacharsis Voir le message
    strtok (la valeur retournée est utile, mais la forme d'appel n'est pas compatible avec les formats) :
    Que veux-tu dire ?

  11. #11
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2012
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 190
    Points : 380
    Points
    380
    Par défaut @souviron34
    le mécanisme de sscanf avec chaîne de format est parfois plus agréable que celui des seuls séparateurs de strtok (ce n'est pas le cas ici avec un texte ne contenant que des chiffres et des espaces).

    j'aurais aimé un sscanf rendant un pointeur sur le premier char non converti (genre strpbrk) ou qui puisse continuer l'analyse en lui passant NULL comme argument (comme strtok)

    A+

Discussions similaires

  1. Lecture fichier texte
    Par vince-60 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 06/04/2006, 14h15
  2. [VB]Probleme lecture fichier text et affichage
    Par clochardevobsy dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 10/03/2006, 08h46
  3. lecture fichier texte et ...
    Par Nils30 dans le forum Langage
    Réponses: 5
    Dernier message: 12/01/2006, 11h55
  4. lecture fichier text et renvoi du contenu en byte *
    Par JulienT dans le forum Réseau
    Réponses: 3
    Dernier message: 02/01/2006, 13h21
  5. Lecture fichier text
    Par krfa1 dans le forum ASP
    Réponses: 13
    Dernier message: 25/11/2005, 08h00

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