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 :

2 questions simple - fichier et fonctions


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Avril 2007
    Messages : 135
    Par défaut 2 questions simple - fichier et fonctions
    Bonjour,

    Je redémmare en C et j'ai 2 questions qui seront simples pour quelqu'un qui a l'habitude.

    1.
    J'essaie de passer en paramètre de ma fonction un tableau de chaine de caractères. Je fais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void main(){
        int MAX = 10;
        char * tab[MAX]
        fonction(&tab);
    }
     
    fonction(char *tab[]){
        *tab[0] = "test";
    }
    Ca ne compile pas... ou est l'erreur ??


    2.Je voudrais lire des lignes dans un fichier texte, et stocker les chaines de caractères dans un tableau. Existe-il une fonction pour récuperer directement les string ?

    mon fichier est de cette forme:

    xxx yyy zzz
    aaa bbb ccc

    j'aimerais récuper les chaine de caractères et les stocker. Comment on fait ?



    Merci d'avance. Ces problèmes me tordent l'esprit.

  2. #2
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    bonjour

    1°/ *tab[ 0 ] c'est un char pas un char*, ici *tab = "ta string" suffit

    2°/
    - fopen pour ouvrir le fichier
    - fgets pour lire le fichier (fait une tite recherche dur le forum le sujet est frequement abordé)
    - fclose pour fermer le fichier

    voila

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Bonjour,
    1. Attention, ici tu ne déclares pas une chaîne, mais un tableau de chaînes (tableau de pointeur sur char).
      Il y a une erreur dans l'appel de fonction (il faut passer tab et non &tab), mais la première erreur est le int pour MAX: En C*, la taille d'un tableau doit être une constante connue à la compilation, et non pas une variable. Remplace ta déclaration de int par un #define et ça devrait marcher.
    2. Eh bien, si tes mots ont une longueur maximale, tu peux utiliser des fscanf(fichier, "%XXs", ton_buffer), où tu remplaces XX par la taille de buffer (en décimal).
      Sinon, c'est plus compliqué. Il n'existe rien de pré-fait en C standard pour lire une ligne de longueur arbitraire (alors que le C++ possède std::getline<>(std::basic_istream<> &, std::basic_string<> &) et que .Net possède Console::ReadLine())

    *pour les standards C89 et C90, les plus utilisés. Le récent standard C99 (qui n'est pas supporté par Visual) autorise les "Variable-Length Arrays" (VLA), dont la taille peut être déterminée à l'exécution.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Invité
    Invité(e)
    Par défaut
    1°) Il manque des allocations. Tu déclares ta taille de chaine en statique, mais ton nombre de chaines en dynamique.
    Donc soit tu sais combien d'éléments tu vas mettre dans ton tableau et tu déclares tab en statique.
    Soit tu ne le sais pas, mais tu peux le calculer à l'ouverture du fichier en regardant la taille du fichier par exemple, et tu fais le malloc correspondant et le free à la fin. Genre si tu connais la taille (avec un fseek) et que tu sais que tu ne vas lire que des groupes de 3 caractères, avec une division tu as le nombre d'éléments à allouer.
    Soit tu ne sais vraiment pas, et tu fais un memory manager. Tu fais un malloc pour allouer, mettons 50 éléments. Tu comptes les éléments que tu rajoutes dans le tableau, et quand t'as atteint 50, tu fait un realloc pour en allouer 50 de plus. Et ainsi de suite tous les 50.

    *tab="test"
    Ca ne marchera pas. Tu ne peux pas affecter une chaine comme ça. Tu passes à la fonction un char**, donc la première chaine de ton tableau, c'est tab[0]. Et pour l'affecter tu dois faire un strcpy(tab[0], "test");

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Sauf que dans le cas présent et sans -Wwrite-strings, ça marche (c'est un tableau de pointeurs, et le code affecte le premier pointeur).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Avril 2007
    Messages : 135
    Par défaut
    ok .. alors merci pour ces réponses. mais cela reste très compliqué

    c'est donc bien ce que j'aimerais faire. Balancer un tableau en fonction, et alouer dynamiquement sa taille suivant le nombre de ligne de mon fichier. Ensuite créer mon tableau avec les différentes chaines de caractère présente dans chaque ligne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    void main(){
     
        char * tab[]
        fonction(&tab);
    }
     
    fonction(char *tab[]){
     
         //malloc de la taille du fichier
         // creation du tableau
        // lecture avec fscanf
     
    }
    est ce que fscanf détecte les espace entre les strings ?

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Pour ça, il faut passer à la fonction un char*** (ou quelque chose de moins imbitable, comme des pointeurs de structures) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    typedef struct chaine
    {
    	char *pChars;
    } s_chaine;
     
    typedef struct tableauChaines
    {
    	s_chaine *pChaines;
    } s_tableauChaines;
     
    void lecture_fichier(s_tableauChaines *pTabChaines)
    {
    	...
    }
    (PS: l'intéret de faire ça, c'est que tu peux aussi, si tu veux, ajouter une variable pour la taille)

    Quant à fscanf(), je ne suis pas sûr de la question, mais un fscanf("%XXs", var) s'arrête au premier espace, puis l'appel suivant reprend juste après, etc. Pour prendre des lignes complètes (\n compris), utiliser fgets().
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Réponses: 3
    Dernier message: 22/12/2011, 22h33
  2. Réponses: 4
    Dernier message: 28/10/2010, 10h21
  3. Question simple sur les threads :)
    Par momox dans le forum C++Builder
    Réponses: 2
    Dernier message: 15/06/2003, 04h13
  4. Edition d'un simple fichier java
    Par mcrepin dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 21/03/2003, 14h28
  5. Fichier de fonctions globales
    Par PEM dans le forum C++Builder
    Réponses: 5
    Dernier message: 10/07/2002, 21h35

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