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 :

Déterminer le nombre de lignes et le nombre de colonnes d'un fichier de données


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 28
    Par défaut Déterminer le nombre de lignes et le nombre de colonnes d'un fichier de données
    Bonsoir,

    J'ai des fichiers des données qui peuvent contenir plusieurs lignes et colonnes.
    Par exemple :

    1 1.2 11
    -1 1.2 -21.01
    ..................
    Je cherche une fonction pour déterminer le nombre de lignes et le nombre de colonnes des données.

    Merci

    Toufan

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 855
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 855
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Toufan Voir le message
    Bonsoir,

    J'ai des fichiers des données qui peuvent contenir plusieurs lignes et colonnes.
    Par exemple :

    1 1.2 11
    -1 1.2 -21.01
    ..................
    Je cherche une fonction pour déterminer le nombre de lignes et le nombre de colonnes des données.

    Merci

    Toufan
    Bonjour

    Mauvaise approche. Tu t'imagines que ton fichier est comme tu nous le montre, c.a.d. comme te l'affiche notepad++ ou gedit ben t'as tout faux.
    Voici comment est exactement ton fichier
    1<tab>1.2<tab>11\n-1<tab>1.2<tab>-21.01\n

    Maintenant que tu le vois mieux, penses-tu vraiment qu'il pourrait exister une fonction magique qui fasse ce que tu veux ?

    Donc voilà. Seule solution possible
    - tu lis ton fichier ligne par ligne (avec fgets() qui s'arrête à chaque '\n')
    - tu comptes combien de colonnes (combien de tabulations) t'as dans ta ligne
    Et si tu as une ligne qui n'a pas le même nombre de tab que les autres, ben à toi de décider...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 28
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bonjour

    Donc voilà. Seule solution possible
    - tu lis ton fichier ligne par ligne (avec fgets() qui s'arrête à chaque '\n')
    - tu comptes combien de colonnes (combien de tabulations) t'as dans ta ligne
    Et si tu as une ligne qui n'a pas le même nombre de tab que les autres, ben à toi de décider...
    Bonjour,

    Mes lignes ont le même nombre de tab. Si, j'ai bien compris , il suffit de fixer une ligne et compter le nombre de tab. Comment fait-on pour compter ce nombre?
    voici mon premier 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
    int CompatageLC(char *NomFich)
    {
    	FILE *FichLec;
    	/* NbL nombre de lignes  */
    	unsigned int NbL,NbLFich=0; 
    	
    	/* pour les colonnes
    	 NbC nombre de colonnes
    	unsigned int NbC,NbCFich=0; */
    	
    	FichLec = fopen(LeNom,"r");
    	if (FichLec != NULL){
    		while ((NbL = getc(FichLec)) != EOF){
     
        if (NbL == '\n'){
            ++NbLFich;
        }
         if (NbC == '  '){
            ++NbCFich;
        }?????? est-ce correct ???????
        }
    	fclose(FichLec);
    	}
    	return NbLFich;	
    }
    Merci

    Toufan

  4. #4
    Membre expérimenté Avatar de quetzacoatl
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 168
    Par défaut
    En fait tu dois définir une variable "saisie" qui contiendra le getc()
    puis tu testes si c'est un '\n' et si NbLfichier est égal à zéro tu testes si c'est un espace(car sinon tu vas compter tous les espaces du fichier)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    char saisie;
    ...
    while ((saisie = getc(FichLec)) != EOF){
     
        if (saisie == '\n'){
            ++NbLFich;
        }
         if (saisie == '  ' && NbLFich==0){
            ++NbCFich;
        }

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 28
    Par défaut
    Citation Envoyé par quetzacoatl Voir le message
    En fait tu dois définir une variable "saisie" qui contiendra le getc()
    puis tu testes si c'est un '\n' et si NbLfichier est égal à zéro tu testes si c'est un espace(car sinon tu vas compter tous les espaces du fichier)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    char saisie;
    ...
    while ((saisie = getc(FichLec)) != EOF){
     
        if (saisie == '\n'){
            ++NbLFich;
        }
         if (saisie == '  ' && NbLFich==0){
            ++NbCFich;
        }
    Je suis arrivé au code suivant :
    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
     
    #include <stdio.h>
    #include <math.h>
    #include <stdlib.h>
     
    int CompatageLC(char *NomFich)
    {
    	int Comptage[];
     
    	FILE *FichLec;
    	/* NbL nombre de lignes  */
    	int NbL,NbLFich=0;
     
    	/* NbC nombre de colonnes   */
    	int NbC,NbCFich=0;
     
    	char saisie;
     
    	FichLec = fopen(NomFich,"r");
    	if (FichLec != NULL){
    		while ((saisie = getc(FichLec)) != EOF){
     
        if (saisie == '\n'){
            ++NbLFich;
        }
         if (saisie =='  ' && NbLFich==0){
            ++NbCFich;
        }
     
    	fclose(FichLec);
    	}
     
     
    }
            Comptage[0]=NbLFich;
    	Comptage[1]=NbCFich;
    	return Comptage;
    }
     
     
    int main(int argc, char *argv[])
    {
     
        CompatageLC(argv[1]);
        return 0;
    }
    qui envoie le message d'erreurs suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Error   : 7  undefined size for 'incomplete array of int Comptage'
    int Comptage[];
    Warning : 25  overflow in char comparison with constant 8224
    if (saisie =='  ' && NbLFich==0){
    Error : 36  illegal return type; found 'pointer to int' expected 'int'
    return Comptage;
    Merci

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 28
    Par défaut
    En modifiant le précédent code, je suis arrivé au code suivant qui fonctionne:
    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
     
    #include <stdio.h>
    #include <math.h>
    #include <stdlib.h>
     
    int CompatageLC(char *NomFich)
    {
     
    	FILE *FichLec;
    	/* NbL nombre de lignes  */
    	int NbL,NbLFich=0;
     
    	/* NbC nombre de colonnes   */
    	int NbC,NbCFich=0;
     
    	char saisie;
     
    	FichLec = fopen(NomFich,"r");
    	if (FichLec != NULL){
    		while ((saisie = getc(FichLec)) != EOF){
     
        if (saisie == '\n'){
            ++NbLFich;
        }
         if (saisie ==' ' && NbLFich==0){
            ++NbCFich;
        }
    	}
     
    	fclose(FichLec);
     
      // printf ("Nombre de lignes %d \n", NbLFich);
      // printf ("Nombre de Colonnes %d \n", NbCFich);
    }
      return NbLFich, NbCFich;
     
    }
     
     
    int main(int argc, char *argv[])
    {
     
        CompatageLC(argv[1]);
        return 0;
    }
    Mon problème : je ne sais pas comment faire pour récupérer les arguments en sortie de la fonction : CompatageLC pour pouvoir les utiliser ailleurs.

    Merci

  7. #7
    Membre expérimenté Avatar de quetzacoatl
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 168
    Par défaut
    Eh bien c'est simple:
    -Premièrement tu as fait:
    int Comptage[];
    Or quand tu déclare un tableau statique tu dois préciser sa taille, donc ici
    -Ensuite j'avais fait une erreur dans le code que je t'ai passé, j'ai mis deux espaces entre les quotes, il n'en faut bien sûr qu'un.
    -Enfin la troisième signifie que tu renvoie un tableau alors que dans le prototype de la fonction tu renvoies un int:
    int CompatageLC(char *NomFich)
    Il faut donc faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int* CompatageLC(char *NomFich)
    (Un tableau statique est en fait un pointeur sur la première case du tableau)

  8. #8
    Membre expérimenté Avatar de quetzacoatl
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 168
    Par défaut
    Tu renvois un pointeur et le tour est joué tu fais dans le main:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int* monPointeur=CompatageLC(argv[1]);

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 28
    Par défaut
    Citation Envoyé par quetzacoatl Voir le message
    Tu renvois un pointeur et le tour est joué tu fais dans le main:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int* monPointeur=CompatageLC(argv[1]);
    Bonjour,

    J'ai fait les modifications, mais j'ai toujours du mal à réccupérer les arguments en sortie de fonction : CompatageLC.
    voici le code modifié :

    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
    #include <stdio.h>
    #include <math.h>
    #include <stdlib.h>
    
    int* CompatageLC(char *NomFich)
    {
    	int Comptage[2];
    
    	FILE *FichLec;
    	/* NbL nombre de lignes  */
    	int NbL,NbLFich=0;
    
    	/* NbC nombre de colonnes   */
    	int NbC,NbCFich=0;
    
    	char saisie;
    
    	FichLec = fopen(NomFich,"r");
    	if (FichLec != NULL){
    		while ((saisie = getc(FichLec)) != EOF){
    
        if (saisie == '\n'){
            ++NbLFich;
        }
         if (saisie ==' ' && NbLFich==0){
            ++NbCFich;
        }
    	}
    
    	fclose(FichLec);
    
      Comptage[0]=NbLFich;
      Comptage[1]=NbCFich;
    }
       return ??????????;
       return Comptage;???
        return Comptage[0], Comptage[1];???
    
    }
    
    
    int main(int argc, char *argv[])
    {
    
    	//CompatageLC(argv[1]);
    	int* monPointeur=CompatageLC(argv[1]);
    	printf ("Nombre de lignes %d et Nombre de colonnes %d\n", monPointeur[0], monPointeur[1]);
        return 0;
    }
    Merci

  10. #10
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Par défaut
    Bonjour,
    tu alloue ou ton pointeur.
    compage ne peut pas être renvoyé car c'est une allocation local a ta fonction
    tu perd la porter a la fin de ta fonction quand elle est dépilé.
    tu dois l'allouer avec un malloc ou un new.

    ensuite c'est bien un return comptage.
    si tu ne veux pas faire d'allocation dynamique tu peux toujours envoyer ton int* en paramètre.

    Mais revois ou vois les portés des variables ton erreur est la.

  11. #11
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    tu dois l'allouer avec un malloc ou un new.
    En C ?!

  12. #12
    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
    Passe Comptage en argument de la fonction :
    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
    void CompatageLC(char *NomFich, int * Comptage)
    {
    	FILE *FichLec;
    	/* NbL nombre de lignes  */
    	int NbL,NbLFich=0;
    ....
      Comptage[0]=NbLFich;
      Comptage[1]=NbCFich;
    }
     
    int main(int argc, char *argv[])
    {
      int comptage[2];
      CompatageLC(argv[1],comptage);
      printf ("Nombre de lignes %d et Nombre de colonnes %d\n", comptage[0], comptage[1]);
      return 0;
    }

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 28
    Par défaut
    Citation Envoyé par jouana Voir le message
    Bonjour,
    tu alloue ou ton pointeur.
    compage ne peut pas être renvoyé car c'est une allocation local a ta fonction
    tu perd la porter a la fin de ta fonction quand elle est dépilé.
    tu dois l'allouer avec un malloc ou un new.

    ensuite c'est bien un return comptage.
    si tu ne veux pas faire d'allocation dynamique tu peux toujours envoyer ton int* en paramètre.

    Mais revois ou vois les portés des variables ton erreur est la.

    Je fais mes premiers pas en C
    . Peux-tu être plus précis.
    tu dois l'allouer avec un malloc ou un new
    A quel niveau?

    Merci

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 26/09/2012, 12h36
  2. Réponses: 0
    Dernier message: 25/09/2012, 17h55
  3. [XL-2003] Calculer le nombre de lignes non vide d'une colonne
    Par zangaloni dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 13/07/2011, 15h30
  4. [XL-2003] calcule le nombre de ligne non vide dans une colonne donnée
    Par aefmaaradji dans le forum Excel
    Réponses: 2
    Dernier message: 27/07/2010, 15h08
  5. Réponses: 4
    Dernier message: 17/11/2007, 17h34

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