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 :

Lire dans un fichier


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 4
    Par défaut Lire dans un fichier
    Bonjour a tous,

    je suis en train de creer un petit programme pour lire un fichier et assigner ses chaines dans un tableau de char*

    mon fichier :

    coucou ca va ?\n
    ca et toi ?\n
    bien\n
    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
     
    char **file_tab()
    {
      int i = 0;
      int j = 0;
      char *str = calloc(1024, sizeof (char) * 1024);
      char **array = malloc(sizeof (char) * 1000 * 1024);
      FILE *file = fopen ("./test", "a+");
     
      if (file == NULL)
        {
        printf("error");
        exit(1);
        }
      while (fgets(str, 1000, file) != NULL)
        {
        array[i] = str;
        printf("%s", str);
        printf("%s\n", array[i]);
        i++;
        }
      while (array[j] != NULL)
        {
        printf("%s", array[j]);
        j++;
        }
      fclose(file);
      return (array);
    }
    a la fin de la lecture lorsque je recupere mon tableau et que je le print je me retrouve avec toutes les cases a la meme valeur, a savoir "bien".

    je n'arrive pas a trouver mon erreur et je solicite donc votre aide...

    bonne journee a tous et merci d'avance !

    PS : desole pour le manque d'accents, je suis sur un qwerty

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 179
    Par défaut
    Bonjour,

    "=" ne permet pas d'affecter correctement une valeur à un string.

    Pour tester j'ai fais tourner ton code avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    array[i] = strdup(str);
    et les lignes en sortie son bonne.
    Bon après l'usage de "strdup" n'est pas toujours pertinent et là ça n'est pas cohérent avec tes allocations de mémoire etc. mais c'est juste pour te donner une idée.

    En tout cas change la manière dont tu affectes "str" à "array[i]"

  3. #3
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    un char* est un pointeur.
    Une chaine entre guillemets est un bloc mémoire "alloué" à la compilation, la chaine existe dans le binaire, et la variable pointe sur cet emplacement du code, qui n'est évidemment pas modifiable

    Pour copier une chaine, il y a plusieurs approche, dont strcat, sprintf, strcpy, strdup, ou une fonction manuscripte copiant chaque caractère.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 4
    Par défaut
    je vous remercie pour vos reponses, j'ai utilise strcpy en changeant 2-3 points de code et ca marche tres bien !

  5. #5
    Membre Expert Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Par défaut
    Bonjour

    Citation Envoyé par Fman77
    j'ai utilise strcpy en changeant 2-3 points de code et ca marche tres bien !
    Il y avait effectivement un problème concernant l'affectation des chaines de caractères mais j'ai envie de dire que c'est anecdotique. En ne changeant que 2-3 points, même avec de la chance, si ça marche, c'est un gros coup de bol voire un effet de bord. On n'a pas la dernière version corrigée mais je suis à peu près certain qu'il y a encore des erreurs et que tu ne maitrises pas bien l'allocation dynamique.


    Déjà, il y a un problème de fond.


    Tu veux utiliser l'allocation dynamique, très bien, c'est ce qu'il faut faire après les premiers temps d'apprentissage. Seulement, tu reportes les incovénients des tableaux/chaines de tailles fixes dans ta façon de procéder. Tu n'alloues pas l'espace dont tu as effectivement besoin mais des zones de tailles fixes ! Que ton fichier ait 3 ou 1000 lignes, tu alloues ton tableau array pour qu'il puisse traiter jusqu'à 1000 x 1024 = 1024000 lignes. C'est "coquet" !!! C'est vraiment ça que tu voulais faire ? J'en doute.

    Pareil pour ton buffer de lecture. Là, la taille fixe ne me gène pas (trop). Par contre, tu alloues un buffer, qui te sert à lire 1 ligne, d'1 méga-octet !

    Là aussi, c'est particulièrement confortable ! Je pense que tu devrais relire la description de calloc. Le fait d'avoir utiliser calloc et pas malloc me laisse aussi penser que tu cherchais à allouer bien plus qu'un buffer pour 1 ligne.


    Ensuite il y a (entre autres choses) :

    - le mode d'ouverture en "a+". Certes, ça va fonctionner mais pour lire un fichier ce n'est vraiment pas naturel

    - une taille max de 1000 dans fgets, incohérente avec la taille allouée

    - tu ne libères jamais la mémoire allouée pour ton buffer de lecture (fuite mémoire - à chaque appel tu perds 1 Mo)


    Bref, tu as mis "résolu", ça semble marcher mais en fait ça marchouille et ça ne plante pas par chance. Comme tu as posté dans "débuter", je te conseille de reprendre le fil, remettre ton code (avec les balises !) qu'on puisse y regarder

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

Discussions similaires

  1. lire dans un fichier .ini
    Par porki dans le forum VB 6 et antérieur
    Réponses: 16
    Dernier message: 16/01/2006, 12h00
  2. lire dans un fichier .txt
    Par Baptiste Wicht dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 17/12/2005, 18h31
  3. Réponses: 4
    Dernier message: 01/12/2005, 01h01
  4. Ecrire et lire dans un fichier texte
    Par podz dans le forum C
    Réponses: 3
    Dernier message: 25/10/2005, 16h57
  5. Réponses: 18
    Dernier message: 09/08/2005, 12h57

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