begin process at 2012 05 29 23:02:03
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Windows

 > 

Autre

 > 

Lecture d'un fichier avec decoupe de chaine.


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Lecture d'un fichier avec decoupe de chaine.

mardi 30 juin 2009 à 11:48:24 | Lecture d'un fichier avec decoupe de chaine.

macbang

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
mardi 30 juin 2009 à 12:01:29 | Re : Lecture d'un fichier avec decoupe de chaine.

macbang

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...
mardi 30 juin 2009 à 13:20:50 | Re : Lecture d'un fichier avec decoupe de chaine.

macbang

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 ...
mardi 30 juin 2009 à 14:25:04 | Re : Lecture d'un fichier avec decoupe de chaine.

macbang

Réponse acceptée !
En ajoutant un malloc avant le strcpy :
ligne[i]->heure= (char*) malloc (strlen(pointeur)+1);

cela ne fonctionne tjs pas ...
mercredi 1 juillet 2009 à 11:31:48 | Re : Lecture d'un fichier avec decoupe de chaine.

rt15

Membre Club Administrateur CodeS-SourceS
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.

#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;
}



Cette discussion est classée dans : fichier, ligne, infos, char, pointeur


Répondre à ce message

Sujets en rapport avec ce message

probléme d'écriture fichier [ par phoenixadb ] phoenixadbJ'ai un problème sur une fonction que je n'arrive pas à résoudremon nom de fichier est test.txtet ma fonction:void ecriturefichier(char* nom lire une ligne dans un fichier txt et extraire les champs entre ; [ par drcmomo ] Bonjour!!je vous en prie aidez moi svp!!j'ecris ce code qui permet de lire un fichier txt, apres l'ouverture je dois lire une ligne et extraire les do Ordre dans les déclarations de variables ??! [ par vincemail ] Bonjour à tous, je suis en train de faire un programme en C++ avec devC++, et je viens de trouver un bug que je n'arrive pas à comprendre, je veux sto [Langage C] Obtenir une ligne d'un fichier (scanf%[^X]) [ par Thranduil ] Bonjour, j'essaie de créer une fonction qui doit lire une ligne entière d'un fichier texte (donc jusqu'au '\n' mais ça ne marche pas. (C'est la même q Récupération d'infos dans un fichier [ par totoscill ] Bonjour,je développe un programme pour récupérer des informations dans un fichier. Les infos récupérer seront ensuite traité.Pour cela mon programme m C pointeur dans un fichier [ par Yunchi ] Bonjour, J'aimerai savoir s'il est possible lors d'une lecture dans un fichier de revenir plus haut dans le fichier. Par exemple on fait des gets don lire un fichier ligne par ligne [ par jOlcoWboY ] Bien le bonjour, je me suis fait un 'tit bou de code afin de lire un fichier texte ligne par ligne. Je voulais juste savoir si il avait des améliorati à l'aide pour fusioné la fonction getline + fct strtok [ par yanlou ] salut,voici mon problmé, je veux lire un fichier txt, je le fais avec la fonction getline. voici le code :#include #include #include int main(){    lecture fichier C [ par ayarikhaoula ] salut tout le monde je souhaite développez une fonction en c : qui lit un fichier ligne par ligne et stoque son contenu dans une chaine de carractère. Programme Moyenne [ par kable78 ] Bonjour, Je cherche à faire un programme qui permet le calcul d'une moyenne à partir d'un fichier. Dans ce fichier doit figurer le nom de l'élève sui


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,343 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales