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 :

Probleme. Compter le nombre de ligne d'un fichier.


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 100
    Par défaut Probleme. Compter le nombre de ligne d'un fichier.
    Bonjour,
    Je souhaite saisir les valeurs numeriques d'un fichier .dat, mais je sais pas de combien de ligne est composer mon fichier.
    Voici le code que j'ai utiliser. La saisi des lignes fonctionne avec ma boucle for mais la condition du while ne fonctionne. Je trouve plein de documentation, la n'est pas le probleme, au contraire je suis un peu perdu. j'utilise Visual C++ 2005 Express et voici ma fonction de lecture de fichier:
    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
    int LireFichier(int TOC[200][200], char namefile[68])
    {
            int NbLineMax=150;
        	FILE* file = NULL;
    	int *var = (int*) malloc (20);
    	char *chaine = (char*) malloc (20);
    	int Nb_ligne=-1;
    	int som;
    	int TabLine[150][20];
     	file = fopen(namefile, "rt");
    	//printf(" start \n");
    	if (file != NULL)
    	{
    		while (fgets(chaine, NbLineMax, file) != NULL )
    		{
    			som=0;
    			for (int c=0;c<20;c++)
    			{
    				fscanf(file,"%d",&var[c]);
    				som=som+var[c];
    				//printf("%i :  %d\n ",c,var[c]); // On affiche la chaîne qu'on vient de lire
    				TOC[Nb_ligne][c]=var[c];
    			}
    			//printf(" somme = %d \n",som);
    			Nb_ligne++;
     
    		}
    	}
    	fclose(file);
    	return Nb_ligne;
    }
    J'ai essayer cette condition dans le while "file2.eof()" mais elle ma donner une erreur de compilation. J'ai oublier de preciser, je sais que j'ai vingt chiffre par ligne separer par des espaces mais je ne sais pas quelle place il prenne en octet. voici un exemple des quatres derniere lignes d'un de mes fichiers.
    lenombre de ligne va entre 13 et 106 pour info.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    42 -76 34 3 187 -76 34 14 67 -70 34 5 0 0 0 0 0 0 0 0
    61 53 0 3 86 91 68 3 69 118 124 2 84 135 112 2 46 52 11 4 
    121 283 326 11 138 284 315 12 163 285 315 14 97 289 349 8 30 326 0 1 
    105 99 169 11 53 103 180 5 104 117 169 8 45 159 180 1 17 180 180 0
    Si vous avez une solution a mon probleme ou un lien vers un lien vers une page ou je pourrai trouver la solution (bien expliquer).
    Merci d'avance pour vos multiple reponses ;-)

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 100
    Par défaut
    Bon je continue quand meme a chercher. J'ai reussi a faire marcher cette condition dans mon while, "!file2.eof ()", mais ca ne fonctionne pas. Voici les derniere modif de mon code:
    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
    	int LireFichier(int TOC[200][200], char namefile[68])
    {
    	int NbLineMax=150;
        	FILE* file = NULL;
    	int *var = (int*) malloc (20);
    	int Nb_ligne=0;
    	int som;
    	std::ifstream file2( namefile ); // j'avais un probleme de definition
    	file = fopen(namefile, "rt");
    	//printf(" start \n");
    	if (file != NULL)
    	{
    		while ( !file2.eof () )
                    {
    			som=0;
    			for (int c=0;c<20;c++)
    			{
    				fscanf(file,"%d",&var[c]);
    				som=som+var[c];
    				//printf("%i :  %d\n ",c,var[c]); // On affiche la chaîne qu'on vient de lire
    				TOC[Nb_ligne][c]=var[c];
    			}
    			//printf(" somme = %d \n",som);
    			Nb_ligne++;
     
    		}
    	}
    	fclose(file);
    	return Nb_ligne;
    }

  3. #3
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Beaucoup de choses sont fausses ici et dangereuses...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	int *var = (int*) malloc (20);
    	char *chaine = (char*) malloc (20);
    - Pas de cast après malloc et il faut mettre un test après malloc pour vérifier le résultat.
    - Ton allocation de var est bizarre... Pourquoi 20 pour un entier ? tu voulais allouer 20 entier, ce n'est pas comme cela que ca se fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int *var = malloc(sizeof(*var) * 20);
     
    if(var == NULL) {
     /* Gestion d'erreur */
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     	file = fopen(namefile, "rt");
    	//printf(" start \n");
    	if (file != NULL)
    	{
            ...
            }
            fclose(file);
    Ce serait bien de mettre le fclose dans le if, non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    		while (fgets(chaine, NbLineMax, file) != NULL )
    Faux ! le deuxième paramètre donne le nombre maximale d'octets que fgets peut utiliser en partant de chaine. Tu as alloué 20 caractères et tu lui dit qu'il peut en utiliser 150... Il faudrait lire les pages man des fonctions.
    http://man.developpez.com

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    			for (int c=0;c<20;c++)
    Attention, c'est juste mais c'est du C99.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    				fscanf(file,"%d",&var[c]);
    Quoi ? tu fais un fgets et après tu oublies ce que t'as lu pour relire dans le fichier ? Pourquoi se souvenir des autres éléments dans ton tableau var ? C'est une valeur temporaire, un seul entier aurait suffit.

    Tu n'utilises pas som ensuite, pourquoi faire ce calcul ? Tu pourrais prendre le temps de nettoyer ton code en enlevant le code en commentaire tout de même...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    				TOC[Nb_ligne][c]=var[c];
    Nb_ligne a été initialisé à -1... C'est pas génial de l'utiliser pendant qu'il a cette valeur...

    J'ai essayer cette condition dans le while "file2.eof()" mais elle ma donner une erreur de compilation.
    Normal, c'est du C++ ca et cela ne ferait pas ce que tu voudrais même en C++...


    Voici une solution qui fonctionne, poses des questions sur ce que tu ne comprends pas :

    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
    54
    55
     
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
    int LireFichier(int TOC[200][200], char namefile[68])
    {
        FILE* file = NULL;
        int var;
        char chaine[128], *end, *lire;
        int Nb_ligne=-1;
        int som, c;
        int TabLine[150][20];
     
        file = fopen(namefile, "rt");
        if (file != NULL)
        {
            Nb_ligne = 0;
            while (fgets(chaine, sizeof(chaine), file) != NULL )
            {
                lire = chaine;
                for (c=0;c<20;c++)
                {
                    var = strtol(lire,&end,0);
     
                    /* Gestion de l'erreur */
                    if(end == chaine) {
                        return -1;
                    }
     
                    /* Prochain */
                    lire = end;
     
                    printf("%d ",var); // On affiche la chaîne qu'on vient de lire
                    TOC[Nb_ligne][c]=var;
                }
                printf("\n");
                Nb_ligne++;
     
            }
            fclose(file);
        }
        return Nb_ligne;
    }
     
    int main()
    {
        int tab[200][200];
        char namefile[68] = "file.txt";
     
        int res = LireFichier(tab, namefile);
     
        printf("Res %d\n",res);
        return EXIT_SUCCESS;
    }
    Jc

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 100
    Par défaut
    OK!
    Bon, rien a dire pour tes remarques, elles sont toutes vrai.
    Cela fait longtemps que je n'ai pas fait de C et j'ai oublier mes bases et je veu sans doute allez trop vite. Je fais plutot du matlab (ce qui explique les erreurs de declaration et de gestion memoire) mais il est trop lent pour les tests que je dois realiser.
    Ton code marche parfaitement, rien a dire (une fois de plus).
    Merci pour le code et les remarque ;-)
    Je tiendrais compte de tes remarques pour les prochains posts.
    Notament, j'ai un probleme de liberation de memoire allouer dynamiquement.
    Je reposterais si je trouve pas mais aurait tu un lien "sur" pour que je revise mais bases et avec un exemple de malloc et free pour un tableaux 2D.
    MERCI ENCORE

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 20
    Par défaut
    http://c.developpez.com/cours/

    cherche allocation dynamique de mémoire en langage C c'est tout bien expliqué.

    Ulnar

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    salut, sous *n*x, si dans un shell tu tapes

    tu as en retour le nombre de lignes de ton fichier (man wc). Pour le C, tu peux faire un truc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    system("wc -l...");
    mais je crois que ce n'est pas portable (enfin la string ne l'est pas). Sinon, fgets() + un compteur

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par salseropom
    Sinon, fgets() + un compteur
    Euh, il y a des risques d'erreur... de comptage si la ligne est trop longue... Le plus simple est fgetc() + comptage des '\n' 'a la volée'. Se méfier de la dernière ligne si elle est incomplète (pas de '\n').

    On peut en profiter pour évaluer quelle est la ligne la plus longue, ça peut faciliter la lecture réelle du fichier par la suite avec fgets(). On peut aussi prévoir une indexation du fichier pour faciliter une lecture 'random' par la suite...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    struct fichier
    {
       size_t nb_lignes;
       size_t ligne_max;
       long **a_index;
    };
     
    /* indexation : 0=sans 1=avec */
    int fichier_info (char const *nom, struct fichier *p, int indexation);
    penser à libérer a_index quand c'est terminé.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Compter le nombre de lignes d'un fichier!
    Par toutounesan dans le forum C++
    Réponses: 11
    Dernier message: 20/09/2007, 11h21
  2. Compter le nombre de ligne dans un fichier
    Par amine_en_france dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 31/05/2007, 17h19
  3. Compter le nombre de lignes d'un fichier ?
    Par [ZiP] dans le forum Delphi
    Réponses: 5
    Dernier message: 22/03/2007, 14h08
  4. Compter le nombre de lignes d'un fichier excel
    Par Freerideuse dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 06/07/2006, 21h49
  5. Réponses: 2
    Dernier message: 02/03/2004, 19h38

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