Lecture d'un fichier avec decoupe de chaine. [Résolu]

Messages postés
14
Date d'inscription
jeudi 25 juin 2009
Dernière intervention
3 juillet 2009
- - Dernière réponse : cs_rt15
Messages postés
3982
Date d'inscription
mardi 8 mars 2005
Dernière intervention
7 novembre 2014
- 1 juil. 2009 à 11:31
Bonjour, je reviens vers vous pour un problème que j'ai du mal a résoudre.
Mon programme ouvre un fichier, le but étant de découper ligne par ligne pour placer des infos dans une structure.

voici une ligne type :
18:02:05 adresseIP "01234#description"

je veux récupérer les infos de l'heure, l'adresse IP, l'ID de l'erreur puis sa description.

variables:

char *ligne[100];
char *pointeur;
int i=0;

type struct infos
{
char *IP;
char *heure;
char *erreur;
char *description
}infos;

infos ligne[500];

voici les séparateurs que j'ai utilisé :
char *sep1={"\t"};
char *sep2={"""};
char *sep3={"#"};
char *sep4={"\r\n"};

Pour l'instant mon programme fait ceci (après ouverture avec succès du fichier texte) :

while ( fgets (ligne,sizeof ligne,fichier) != NULL )
{
i++;

pointeur = strtok (ligne,sep1);
ligne[i].heure = pointeur;

pointeur = strtok (NULL,sep1);
ligne[i].IP = pointeur;

pointeur = strtok (NULL,sep2);
pointeur = strtok (NULL,sep3);
ligne[i].erreur = pointeur;


pointeur = strtok (NULL,sep2);
ligne[i].description = pointeur;

}

Lors de la première itération, tout ce passe très bien.
A la seconde itération, la variable ligne prend bien la seconde ligne du fichier texte, mais une erreur se produit lors de la copie de pointeur dans ligne[2].heure.

Pourriez vous me débloquer ? Merci
Afficher la suite 

Votre réponse

4 réponses

Meilleure réponse
Messages postés
14
Date d'inscription
jeudi 25 juin 2009
Dernière intervention
3 juillet 2009
3
Merci
En ajoutant un malloc avant le strcpy :
ligne[i]->heure= (char*) malloc (strlen(pointeur)+1);

cela ne fonctionne tjs pas ...

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 119 internautes nous ont dit merci ce mois-ci

Commenter la réponse de macbang
Messages postés
14
Date d'inscription
jeudi 25 juin 2009
Dernière intervention
3 juillet 2009
0
Merci
Petite rectification :
cette algorithme fonctionne, MAIS ceci est une fonction de mon programme.
La structure est une variable globale , pour pouvoir la récupérer ensuite, je suis obligé de la passé en pointeur.
je la déclare dans le main :
infos *lignes[500];

prototype de ma fonction :
int decoupage (infos *lignes[]);

j'appel ma fonction dans le main comme ceci.
k = decoupage(&lignes)

je remplace les " . "  par des " -> " dans ma fonction
( ligne[i]->IP = pointeur; )

Et le problème survient alors après la première itération ...
Sans ce problème de récupération de tableau avec un pointeur, l'algorithme fonctionne...
Commenter la réponse de macbang
Messages postés
14
Date d'inscription
jeudi 25 juin 2009
Dernière intervention
3 juillet 2009
0
Merci
nouvelle rectification :

je la déclare dans le main :
infos lignes[500];

prototype de ma fonction :
int decoupage (infos *lignes[]);

j'appel ma fonction dans le main comme ceci.
k = decoupage(lignes)

Dans la fonction j'ai remplacer les :
ligne[i]->erreur = pointeur;
par :
strcpy (ligne[i]->erreur , pointeur);

Plante des le premier strcpy ...
Commenter la réponse de macbang
Messages postés
3982
Date d'inscription
mardi 8 mars 2005
Dernière intervention
7 novembre 2014
11
0
Merci
Salut,

Tu t'en es sorti avec des malloc de tous les champs de ta structure infos ?
Côté performance et consommation mémoire, c'est moche...

Tu as deux variables "ligne", une qui est un tableau d'info et l'autre qui est une ligne de fichier lu par fgets...

En C, un tableau c'est un pointeur. Mais :
int *tab;    // Tu as juste un pointeur sur une zone non allouée
int tab[];   // Pareil
int tab[50]; // Un tableau de 50 int est réservé

Pour pouvoir écrire dans un tableau "int tab[]", il faut le faire pointer vers quelque chose, allouer par un malloc par exemple.

Il faut que tu es une bonne représentation dans ta tête de où sera écrit quoi.
Réfléchi à tes structures de données avant de coder.
Il ne faut pas faire des éssais au hasard jusqu'à ce que ça marche.

Donne des noms de variable en anglais. Personne ne code en français. C'est beaucoup plus pratique pour les accents.

En C les tableaux démarrent à zéro.

Pas besoin de {} pour les initialisation de chaînes.
<hr size="2" width="100%" />#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct _infos
{
  char IP[20];
  char heure[20];
  char erreur[10];
  char description[80];
}
infos;

char *sep1 = "\t";
char *sep2 = """;
char *sep3 = "#";

void ReadLogFile(infos *ligne, int *count)
{
  char ligneFichier[100];
  char *pointeur;
  FILE *fichier;

  fichier = fopen("test.txt", "r");
  if (! fichier)
  {
    printf("Echec de l'ouverture du fichier\n");
    return;
  }

  *count = 0;
  while (fgets(ligneFichier, sizeof(ligneFichier), fichier) != NULL)
  {
    pointeur = strtok(ligneFichier, sep1);
    strcpy(ligne[*count].heure, pointeur);

    pointeur = strtok(NULL, sep2);
    strcpy(ligne[*count].IP, pointeur);

    pointeur = strtok(NULL, sep3);
    strcpy(ligne[*count].erreur, pointeur);

    pointeur = strtok(NULL, sep2);
    strcpy(ligne[*count].description, pointeur);

    (*count)++;
  }
 
  fclose(fichier);
}

void DisplayLogFile(infos *ligne, int count)
{
  int i;

  for (i = 0; i < count; i++)
    printf("%s %s %s %s\n", ligne[i].IP, ligne[i].heure, ligne[i].erreur, ligne[i].description);
}

int main()
{
  infos *ligne;  /* Tableau des lignes du fichier */
  int count;     /* Nombre de lignes du fichier */
 
  /* Allocation du tableau dans le tas car 500 * sizeof(infos) ça commence à faire */
  ligne = (infos*)malloc(500 * sizeof(infos));

  /* Lecture du fichier */
  ReadLogFile(ligne, &count);

  /* Affichage du tableau */
  DisplayLogFile(ligne, count);
  free(ligne);
  return 0;
}
Commenter la réponse de cs_rt15

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.