[C] Segmentation fault lecture fichier

Résolu
lefoufighter Messages postés 277 Date d'inscription   Statut Membre Dernière intervention   -  
lefoufighter Messages postés 277 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour à tous,
je devrais ouvrir un fichier et s'il commence par "drawing" récuperer tous les champs qui suivent; mais pour le moment j'ai un "segmentation fault" si quelqu'un pouvait m'aider :
int main(int argc, char *argv[])
{	
	
	int i;
	const int TAILLE_MAX = 500;
	char ligne[TAILLE_MAX];
	char *tokens[100];
    	FILE* fichier = NULL;
/* ouverture du fichier en lecture seule */
    	fichier = fopen("usd200607.DAT","r");	
	if (fichier != NULL)
    	{
		while (fgets(ligne, TAILLE_MAX-1, fichier) != NULL)
		{	
			i = 0;
			tokens[i] = strtok(ligne,"|");
			while (tokens[i] != NULL)
			{
				tokens[++i] = strtok(ligne," ");
			}
			if(strcmp(tokens[0],"Drawing"))
				printf("%s\n",tokens[1]);
			fgets(ligne,TAILLE_MAX-1,fichier);
		}	
		fclose(fichier);
	}
 	exit(0);
}


Merci d'avance pour votre aide

--
Il n'existe que deux choses infinies, l'univers et la bêtise humaine...
mais pour l'univers, je n'ai pas de certitude absolue. <Albert Einstein>
Configuration: Linux
Firefox 2.0.0.3

5 réponses

  1. lefoufighter Messages postés 277 Date d'inscription   Statut Membre Dernière intervention   99
     
    Oui ok merci bien ca fonctionne ;-)
    1
  2. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    essaie au lieu de
    char *tokens[100];

    ecrit
    char *tokens;
    tokens = (char *) malloc(sizeof(char) * TAILLE_MAX);
    --
    lami20j
    0
    1. lefoufighter Messages postés 277 Date d'inscription   Statut Membre Dernière intervention   99
       
      mais maintenant il me mets des erreurs qd j'utilise tokens probleme de cast avec les pointeurs je dois changer quoi ?

      datSQL.c: In function ‘main’:
      datSQL.c:29: warning: assignment makes integer from pointer without a cast
      datSQL.c:30: warning: comparison between pointer and integer
      datSQL.c:32: warning: assignment makes integer from pointer without a cast
      datSQL.c:35: warning: passing argument 1 of ‘strcmp’ makes pointer from integer without a cast
      

      0
    2. Stupeflip Messages postés 391 Date d'inscription   Statut Membre Dernière intervention   94
       
      Salut,

      EDIT : Après relecture du programme, j'ai l'impression que tu veux en fait faire de tokens un tableau de pointeurs ? Il faudrait faire un malloc du genre :
      char **tokens;
      tokens = (char **) malloc(sizeof(char *) * TAILLE_MAX);

      Mais j'suis pas sur ^^
      0
      1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571 > Stupeflip Messages postés 391 Date d'inscription   Statut Membre Dernière intervention  
         
        Salut,

        j'ai eu le même reflexe que toi :-)
        0
      2. Stupeflip Messages postés 391 Date d'inscription   Statut Membre Dernière intervention   94 > Stupeflip Messages postés 391 Date d'inscription   Statut Membre Dernière intervention  
         
        Voui ^^
        0
  3. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    C'est moi qui c'est trompé

    en fait tu dois bien utiliser char *tokens[100];

    vu que tu as besoin d'un tableau de chaînes de caractères
    il te reste à allouer de la mémoire

    tokens = (char **) malloc(100)


    0
  4. Stupeflip Messages postés 391 Date d'inscription   Statut Membre Dernière intervention   94
     
    Non non fais comme Lami20j te dit dans son msg <4> et ça devrait être bon.
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. lefoufighter Messages postés 277 Date d'inscription   Statut Membre Dernière intervention   99
     
    merci déja pour votre aide, en fait ce que je voudrais faire c'est pour chaque ligne commencant par "drawing", je recupere dans tableau tokens[] tous les elements :
    Ex dans mon fichier usd200607.DAT j'ai la ligne
    Drawing : 0001 | 2006-07-01 | LR 3 | 53917.833 | -02.62 +2.89 003.15 |
    et donc que en
    tokens[0] <- Drawing
    tokens[1] <- 2006-07-01
    tokens[2] <- LR 3
    et ainsi de suite...
    Je ne pense pas que le char **tokens soit nécessaire dans ce cas-ci et modifier les strtok aussi
    -1