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 :

Fichier et tableaux


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 13
    Par défaut Fichier et tableaux
    Bonjour,

    j'ai un problème dans la création de mon programme et c'est pour cela que je viens vous voir. J'essaye de mettre le contenu de mon fichier dans un tableau pour ensuite pourvoir traiter les données. Mon programme compile mais quand je le lance il me met une erreur de segmentation que je ne comprend pas. Le problème se trouve au niveau du fichier. En effet, quand j'ai un fichier .txt il n'y a aucun problème mais mon fichier est en .log (fichier interne donc je ne peux pas le transformer). Mais je ne comprend pas pourquoi ca ne pourrait pas marcher.
    Si vous avez une idée merci a l'avance.

    Voici mon programme :

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define TAILLE_MAX 100
    #define NOMBRE_MAX_LIGNES 100
     
    int main(int argc, char *argv[])
    {
        FILE *fichier = NULL;
        char chaine[TAILLE_MAX] = "";
        int nbre=0;
        int tailleTab=0;
        char Tab[NOMBRE_MAX_LIGNES][TAILLE_MAX];
        long j=0 ;
     
        fichier = fopen("fichier.log", "r");
    	if (fichier != NULL) {
               while (fgets(chaine, TAILLE_MAX, fichier) != NULL) {
                  strcpy(Tab[j],chaine);
                  j++;
               }
    	}
     
    	tailleTab=j;
    	j=0;
    	while(j<tailleTab){
    		printf("%s",Tab[j]);
    		j++;
    	}
            fclose(fichier);
        return 0;
    }
    J'ai également une autre question :
    imaginons une ligne de mon fichier comme ceci "blobloblo blablabla blobloblo"
    Je souhaite récupérer seulement le blablabla dans mon tableau. Il faut donc déplacer le pointeur. J'ai essayer avec ceci fseek(fichier, 21, SEEK_SET); mais il ne se passe rien. Ensuite pour enlever ce qui a derrière j'ai essayer une boucle for comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(i=0;i<=41;i++){					
    caractereActuel = fgetc(fichier);
    printf("%c", caractereActuel);
    }
    mais impossible de le mettre dans mon tableau.

    De plus, j'aimerai afficher qu'une seule fois les lignes (enlever celle qui sont identiques et les compter) pour cela j'utilise ma boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    while(j<tailleTab){
    	for(k=0;k<tailleTab;k++){
    		for(y=1;y<tailleTab;y++){
    			if(Tab[k]==Tab[y]){
    				printf("%s",Tab[y]);
    				nbre++;	
    				printf("%i \n",nbre);
    				Tab[y]=NULL;
    			}
    		}
    	}
    }
    mais pour le moment je n'ai pas réussi a la faire fonctionner.

    merci

  2. #2
    Membre chevronné
    Inscrit en
    Mars 2010
    Messages
    439
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 439
    Par défaut
    euh
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (fgets(chaine, TAILLE_MAX, fichier) != NULL)
    c'est EOF non le terme de fin de fichier.

  3. #3
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 13
    Par défaut
    pour ma première question j'ai résolu le problème merci par contre je bloque toujours sur la suite

  4. #4
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 13
    Par défaut
    Mon programme a évoluer mais il me reste un problème, enlever les doublons de mon fichier et les compter. Le problème se trouve dans les for imbriquer je pense. Si vous avez une idée, merci.

    Voici mon programme :

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define TAILLE_MAX 1000
    #define NOMBRE_MAX_LIGNES 1000
     
    int main(int argc, char *argv[])
    {
     
    	char *resultat1;
    	char *resultat2;
        FILE *fichier = NULL;
        char chaine[TAILLE_MAX] = "";
    	int nbre=0;
    	int chaine2=0;
    	int tailleTab=0;
    	long j=0;
    	long y=0,k=0;
    	char Tab[NOMBRE_MAX_LIGNES][TAILLE_MAX];
     
        fichier = fopen("fichier.log", "r");
    	if (fichier != NULL) {
            while (fgets(chaine, TAILLE_MAX, fichier) != NULL) {
    			resultat2 = strstr(chaine, "[");
    			if (resultat2 != NULL) {
    				resultat1 = strstr(resultat2, "blabla");
    				if (resultat1 != NULL){			
    					strcpy(Tab[j],resultat2);
    					strncpy( Tab[j]+21, "", 20 );
    					j++;
    				}
    			}
    		}
    	}
     
    	tailleTab=j;
    	j=0;
    	while(j<tailleTab){
    		for(k=0;k<tailleTab;k++){
    			for(y=1;y<tailleTab;y++){
    				if(Tab[k]==Tab[y]){
    						printf("%s\n",Tab[y]);
    						y++;
    						nbre++;
    						printf("%i \n",nbre);
    						//Tab[y]=0;
    				}
    			}
    		}
    	 }
        fclose(fichier);
        return 0;
    }

  5. #5
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    On ne compare pas le contenu de tableaux de cette façon : ici, tu compares les adresses du début des tableaux. Utilise strcmp().

  6. #6
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par snowpy Voir le message
    euh
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (fgets(chaine, TAILLE_MAX, fichier) != NULL)
    c'est EOF non le terme de fin de fichier.
    Non, fgets() renvoie bien NULL si la fin de fichier est atteinte (la valeur de retour étant un char*, il me semble compromis de vouloir renvoyer EOF qui est un entier).
    Les fonctions de lecture d'un caractère (getchar, fgetc, ...) renvoie bien pour leur part EOF lorsque la fin de fichier a été atteinte.

  7. #7
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 13
    Par défaut
    bonjour,

    même en utilisant strcmp j'ai le même problème il me les compte a l'infini en fait je ne sais pas comment supprimer une case du tableau une fois qu'il la comparer ( pour enlever les doublons et éviter d'aller jusqu'à l'infini)

    merci

  8. #8
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 13
    Par défaut
    j'ai modifier ma boucle while. désormais j'arrive a compter les champs identiques mais je n'arrive pas a les supprimer.
    en fait je voudrais qu'il m'affiche ceci par exemple :
    bloblo compter 3 fois
    blabla compter 1 fois
    ...

    voici ma boucle while :

    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
     
    while(j<tailleTab && k<tailleTab2){  
    		s=strcmp(Tab[j],Tab[k+1]);
    		j++;
    		k++;	
    		if(s==0){			
    			nbre++;
    			e=nbre;
    			h++;
    			printf("identique  ");			
    		} 
    		else{
    			printf("pas identique  ");	
    			nbre=1;
    			f=nbre;
    		}	
    		if(e>f){
    			if(h>1)
    			printf("%i  \n",e);
    			e=0;
    		}
    		else
    			printf(" %i  \n",f);
    			printf("%s  ",Tab[k]);
     
    	}

Discussions similaires

  1. [WD16] Importation d'un fichier .TXT (tableaux) dans une table
    Par moimoi78 dans le forum WinDev
    Réponses: 4
    Dernier message: 11/04/2011, 18h28
  2. Réponses: 0
    Dernier message: 11/11/2010, 08h30
  3. Fichier et Tableaux
    Par axelfelix dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 17/05/2010, 14h36
  4. [Free Pascal] Fichiers et tableaux
    Par Bruno0693 dans le forum Free Pascal
    Réponses: 6
    Dernier message: 15/10/2008, 12h07
  5. Réponses: 4
    Dernier message: 24/11/2007, 09h12

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