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 :

recherche commande de lecture de ligne


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 8
    Points : 2
    Points
    2
    Par défaut recherche commande de lecture de ligne
    Bonjour à tous.

    J'ai un projet informatique en C et dans ce cadre j'ai besoin de lire un fichier texte qui rentre par l'entrer standard stdin.

    dans ce fichier, il y a lein de ligne avec plein de chose que je traite (via des fgets), jusqu'à arriver à une ligne qui contient des flottants en ligne séparé par des tabulations. J'aurais besoin de les lire un par un. Je ne connait pas le nombre de chiffre qu'il y dedans.

    Donc je cherche une commande qui pourrai me permettre de faire cela.

    Merci d'avance pour votre aide.

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Tu travailles sous Linux / Unix ? Tu lances ton programme en ligne de commande ?

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Pour appeler le programme j'utilise la commande UNIX suivante :

    cat conf.txt | ./prog > sortie.txt

    Le programme s'appelle "prog", pour la sortie sur stdout j'ai pas de problème, pour l'entré, j'ai plus de mal, elle est contenue dans conf.txt

  4. #4
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    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 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Bonjour,

    Une petite précision:
    le pipe provoque le chainage de la sortie standard du programme de gauche dans l'entrée standard du programme de droite.

    En l'occurence, le stdin de ./prog contiendra exclusivement le stdout de cat, c'est à dire le contenu de conf.txt. Mais ce n'est pas le fichier lui-même.

    Supposont que ton fichier contiennent cette fameuse ligne tabulée.
    Si tu sais combien il y a de colonne, tu peux utiliser un scanf.
    Dans le cas de trois entrées, ca donnerait (si %f est bien la lecture d'un float):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    scanf("%f\t%f\t%f", &f1, &f2, &f3);
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Justement c'est ça le problème c'est que je ne connait pas le nombre de colonne à l'avance, d'où mon problème , je ne peut donc pas utiliser scanf .

  6. #6
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par dragonlost Voir le message
    Justement c'est ça le problème c'est que je ne connait pas le nombre de colonne à l'avance, d'où mon problème , je ne peut donc pas utiliser scanf .
    Bonjour.

    Il ne te reste plus donc plus qu'à parser tes lignes. Tu charges les lignes entières et tu extrais les textes séparés par des \t. Une boucle avec strstr(); devrait faire l'affaire je pense.

  7. #7
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    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 189
    Points : 17 141
    Points
    17 141
    Par défaut
    si, en étant malin.
    Tu peux utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(scanf("%f", &f)==1) {/*utiliser f*/}
    .
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  8. #8
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    A condition que la ligne suivante ne débute pas par un chiffre !
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  9. #9
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Pourquoi ne pas :
    • lire le fichier ligne par ligne avec fgets()
    • pour chaque ligne, tester si c'est une ligne avec des flottants (avec le retour de fscanf())
    • si ça marche on a trouvé la ligne qu'on cherche donc on l'analyse
    • sinon, on passe à la ligne suivante

    ?

    Si on tombe dans le cas de diogene, on aura déjà traité une ligne de flottants, donc on sait que la ligne suivante n'est pas celle qu'on cherche même si elle commence par un flottant.

  10. #10
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Alors j'ai utilisé while(scanf("%f" &f)==1){} mais ça ne me sort que le premier chiffre de la ligne.

    Il faudrait pouvoir réussir à extraire un à un les flottants de la ligne.
    J'ai trouver la fonction strtok mais il faut déjà que j’extrais toute la ligne.

    je lis déjà les ligne précédente du fichier avec fgets. Je suis déjà dans la bonne ligne.

  11. #11
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Si tu sais que tu es à la bonne ligne, tu peux récupérer toute entière avec fgets(). Ensuite, tu peux faire un code comme ceci :
    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
    #include <stdio.h>
    #include <string.h>
     
    int main(void)
    {
    	const char *string = "1.1 2.2 3.3 4.4 5.5 6\n";
    	float f = 0;
    	const char *p = string;
    	const char sep = ' ';
    	do
    	{
    		sscanf(p, "%f", &f);
    		printf("%f\n", f);
     
    	} while((p =strchr(p, sep) + 1) != NULL);
    }
    PS : j'ai testé et le code suivant lit bien des nombres séparés par des espaces depuis l'entrée standard :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	while(scanf("%f", &f) == 1)
    	{
    		printf("%f\n", f);
    	}

  12. #12
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Merci pour le premier code.

    Mais j'ai un problème pour lire la ligne avec fgets. Pour fgets je doit mettre une taille hors je n'est pas la taille de la ligne. Et je doit aussi mettre cette ligne dans une variable. mais comment faire si je ne connait pas la taille de cette variable à l'avance.

    Pour le deuxième code je ne comprend pas pourquoi ça marche car à chaque fois qu'on fait un scanf, on change de ligne dans l'entrer standard

  13. #13
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Tu n'as aucune idée de la taille maximum d'une ligne ? Si oui, tu prends un peu large et voilà.

    Non, on ne change pas de ligne. On avance simplement de la quantité de données lues.

  14. #14
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Merci beaucoup.

    J'ai enfin réussi le deuxième programme. Ce qui m'a permis de l'appliquer et de résoudre mon problème.

    Merci à vous.

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

Discussions similaires

  1. lecture et recherche d'expression sur une ligne
    Par valdano dans le forum Linux
    Réponses: 9
    Dernier message: 04/05/2012, 19h36
  2. Réponses: 0
    Dernier message: 31/10/2011, 17h17
  3. [MS-DOS]Recherche d'un poste en ligne de commande
    Par Kcirtap dans le forum Windows XP
    Réponses: 4
    Dernier message: 26/03/2007, 12h30
  4. pb lecture de ligne dans un texte
    Par bidoo dans le forum C++
    Réponses: 4
    Dernier message: 22/10/2005, 13h23
  5. Recherche commande - Paquets entrants
    Par nicolas66 dans le forum Applications et environnements graphiques
    Réponses: 6
    Dernier message: 14/10/2005, 22h38

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