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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 29
    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 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    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 026
    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
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 29
    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 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    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 026
    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
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 29
    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 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    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 026
    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]);

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