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 :

lecture de lignes de longueurs variables


Sujet :

C

Vue hybride

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 13
    Par défaut lecture de lignes de longueurs variables
    Bonjour,

    Je cherche à lire un fichier composé de plusieurs lignes du type suivant:
    les textes sont séparés par des ":"
    texte:texte:entier entier entier:texte:texte:texte......
    (exemple
    T_1 : State of the Art: 12 41 35 Geriatric Medicine:Rehabilitation Medicine:Old Age Psychiatry:
    )
    Autant la lecture des deux premiers textes et des entiers se fait bien, autant la dernière série des "textes" ne se fait. En fait il ne voit pas la fin de ligne.
    (je ne suis pas le paganini du C, ecriture basic :-( )
    voici mon bout de code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    i=1;
    while(fscanf(lecture1,"%[^:]%*c %[^:]%*c",tmp1,tmp2))
    	{
    	sprintf(tasks[i],"%s",tmp2);
    	fscanf(lecture1,"%d %d %d %[^:]%*c %[^:]%*c",&start[i],&ending[i],&load[i],tmp1,tmp2);
    	while(fscanf(lecture1,"%[^:]%*s",tmp1)==1)
    		sprintf(task_comp[i],"%s",tmp1);
    	i++;
    	}
    merci par avance à toute personne qui peut me faire progresser.

    M

  2. #2
    Membre éprouvé
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2008
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2008
    Messages : 143
    Par défaut
    Pourquoi ne pas utiliser un :
    fgets()
    pour faire une lecture complete de la ligne dans le fichier et ensuite
    découper cette ligne à grand coup de strtok() ?

    Essais déjà de lire toute les ligne de ton fichier avec (par exemple) une boucle
    contenant un fgets() et affiche ligne par ligne (dans un but de debug seulement) puis découpe les en sous partie avec strtok().

    lien vers le man fgets()

    lien vers le man strtok()

    Voila

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 13
    Par défaut
    Essais déjà de lire toute les ligne de ton fichier avec (par exemple) une boucle
    contenant un fgets()
    Je ne sais peut-être pas utilsier le fgets, mais d'après le man, il faut donner la tailel (-1) en argument. or je ne connais pas a priori le nombre de caractères que je dois lire....

  4. #4
    Membre éprouvé
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2008
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2008
    Messages : 143
    Par défaut
    Ma foi le même problème se produira pour l'utilisation du fscanf()...
    Puisque de tout façon tu doit allouer une taille de buffer qui sera au maximum la taille de la plus grande ligne.

    Je te conseillerais de voir si tu peut pas prévoir la taille de la PLUS GRANDE LIGNE et accorder ton code en conséquence...

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2006
    Messages : 107
    Par défaut
    Sinon tu peux utiliser la fonction gnu "getline", qui t'évite de connaître la taîlle de la ligne à lire. "man getline" pour plus d'infos

  6. #6
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Personnellement, je fairais une première passe à travers le fichier afin de déterminer la taille de la ligne la plus longue, puis j'allouerais la mémoire pour un tampon de taille adéquate permettant une lecture et une analyse ligne par ligne du fichier.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  7. #7
    Membre éprouvé
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2008
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2008
    Messages : 143
    Par défaut
    Citation Envoyé par apesle Voir le message
    Sinon tu peux utiliser la fonction gnu "getline", qui t'évite de connaître la taîlle de la ligne à lire. "man getline" pour plus d'infos
    De toute facon, comme pour fscanf et fgets, tu doit avoir un buffer qui est alloué en conséquence pour pouvoir contenir ta ligne complete DONC peut importe la fonction que tu va utiliser tu va devoir allouer soit un buffer trop grand ou sinon, comme le dit Thierry, tu peux faire une première passe pour savoir la ligne qui a la plus grande taille.

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

Discussions similaires

  1. Importer un .txt avec lignes de longueur variable
    Par polo92 dans le forum SAS Base
    Réponses: 7
    Dernier message: 06/10/2014, 11h04
  2. Lecture par bouts de chaînes de longueur variable
    Par Chavadam dans le forum Débuter avec Java
    Réponses: 9
    Dernier message: 09/08/2013, 20h29
  3. Lecture de lignes de longueur différente
    Par melreg dans le forum MATLAB
    Réponses: 4
    Dernier message: 11/08/2009, 16h43
  4. pb lecture de ligne dans un texte
    Par bidoo dans le forum C++
    Réponses: 4
    Dernier message: 22/10/2005, 13h23
  5. Pb import fichier txt avec lignes de longueurs diverses
    Par zebulon90 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 09/12/2004, 08h32

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