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

macbang 14 Messages postés jeudi 25 juin 2009Date d'inscription 3 juillet 2009 Dernière intervention - 30 juin 2009 à 11:48 - Dernière réponse : cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention
- 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
macbang 14 Messages postés jeudi 25 juin 2009Date d'inscription 3 juillet 2009 Dernière intervention - 30 juin 2009 à 14:25
3
Merci
En ajoutant un malloc avant le strcpy :
ligne[i]->heure= (char*) malloc (strlen(pointeur)+1);

cela ne fonctionne tjs pas ...

Merci macbang 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 74 internautes ce mois-ci

Commenter la réponse de macbang
macbang 14 Messages postés jeudi 25 juin 2009Date d'inscription 3 juillet 2009 Dernière intervention - 30 juin 2009 à 12:01
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
macbang 14 Messages postés jeudi 25 juin 2009Date d'inscription 3 juillet 2009 Dernière intervention - 30 juin 2009 à 13:20
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
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 1 juil. 2009 à 11:31
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.