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 :

Affichage en colonne a la ls


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 99
    Points : 55
    Points
    55
    Par défaut Affichage en colonne a la ls
    Bonjour,

    Je voudrais imprimer une liste de fichier en colonne, et pour le moment donc je fais une loop avec un write pour chaque nom suivi d'un '\n'.
    Mais maintenant je voudrais faire l'affichage propre, sachant qu'au moment de creer ma liste je regarde chaque taille des chaine pour en ressortir la largeur max.
    J'ai eu le tips tu man 4 tty dans lequel on nous parle de ioctl. Est ce que quelqu'un sait maintenant comment on utilise ce bordel ou me donner un exemple..? Le seul truc que j'ai reussi a faire c'etait decaler le write par le taille du write le precedent, mais il sautait toujours des lignes entre chaque write.

    Est ce que quelqu'un a un cours/tuto en francais si possible dessus, ou un exemple?

  2. #2
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Tu pourrais par exemple t'aider de certains spécificateurs de format de la famille de printf :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    snprintf(buf, bufsz, "%*.*s", (int)colsz, (int)colsz, str);
    Explication de la ligne ci-dessus :

    • le premier * spécifie la longueur minimale du champ à l'aide d'un paramètre de type int, le champ est comblé avec des caractères d'espacement (' ') ;
    • la combinaison .* spécifie la longueur maximale de la partie « données » du champ à l'aide d'un autre paramètre de type int.

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 99
    Points : 55
    Points
    55
    Par défaut
    Non par ce que, dans ls quand tu replace tes colonnes, le debut de ta deuxieme colonne va au bout de la premiere. C'est vraiment pas afficher ligne par ligne. Je voudrais exactement le meme comportement avec | cat -e ou tu vois bien les retour a la ligne

  4. #4
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Pourrais-tu nous montrer un exemple du résultat que tu cherches à obtenir et nous détailler les difficultés que tu rencontres ce faisant ?

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 99
    Points : 55
    Points
    55
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    bash-3.2$ ls /
    Applications			Users				dev				installer.failurerequests	sgoinfre
    Developer			Volumes				etc				net				sgoinfre_old
    Library				bin				exam				nfs				tmp
    Network				cdn				goinfre				private				usr
    System				cores				home				sbin				var
    Comme ceci, je suis sur mac donc ls range les elements de la liste par valeur ascii. Et donc Users il donc apres System dans cette liste mais se retroure en haut de la deuxieme colonne.
    Et avec le cat-e
    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
    bash-3.2$ ls / | cat -e
    Applications$
    Developer$
    Library$
    Network$
    System$
    Users$
    Volumes$
    bin$
    cdn$
    cores$
    dev$
    etc$
    exam$
    goinfre$
    home$
    installer.failurerequests$
    net$
    nfs$
    private$
    sbin$
    sgoinfre$
    sgoinfre_old$
    tmp$
    usr$
    var$
    La difficulte reside dans la comprehension ioctl, je n'arrive pas a l'utiliser correctement

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Ce que tu veux c'est afficher l'élément X dans la colonne 1, X + Y dans la colonne 2, X + Z dans la colonne 3 etc... avec X = 0 pour la première ligne, X = 1 pour la seconde ligne etc...
    Les décallages varient en fonction du nombre de colonnes que tu veux avoir, un peu d'arithmétique basique devrait fournir les opérations à exécuter.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  7. #7
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 99
    Points : 55
    Points
    55
    Par défaut
    Non j'avais l'impression que en gros ioctl te permettait de revenir a une ligne anterieur et d'ecrire encore dessus. En gros imprimer colonne 1, puis colonne 2 etc..
    Donc il faut ignorer les '\n' ligne par ligne. Faut que je nettoie un peu mon code et retest du coups.

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 685
    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 685
    Points : 30 974
    Points
    30 974
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par minipopov Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    bash-3.2$ ls /
    Applications			Users				dev				installer.failurerequests	sgoinfre
    Developer			Volumes				etc				net				sgoinfre_old
    Library				bin				exam				nfs				tmp
    Network				cdn				goinfre				private				usr
    System				cores				home				sbin				var
    Comme ceci, je suis sur mac donc ls range les elements de la liste par valeur ascii. Et donc Users il donc apres System dans cette liste mais se retroure en haut de la deuxieme colonne.
    Et avec le cat-e
    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
    bash-3.2$ ls / | cat -e
    Applications$
    Developer$
    Library$
    Network$
    System$
    Users$
    Volumes$
    bin$
    cdn$
    cores$
    dev$
    etc$
    exam$
    goinfre$
    home$
    installer.failurerequests$
    net$
    nfs$
    private$
    sbin$
    sgoinfre$
    sgoinfre_old$
    tmp$
    usr$
    var$
    Bonjour

    Chaque colonne aura la taille du nom le plus long (ici "installer.failurerequests") et est suivie d'au-moins une tabulation (mais parfois deux ou trois pour les noms courts). Et la dernière colonne est bien suivie d'un '\n'.
    Donc ça devient effectivement un problème d'arithmétique...

    Citation Envoyé par minipopov Voir le message
    Non j'avais l'impression que en gros ioctl te permettait de revenir a une ligne anterieur et d'ecrire encore dessus. En gros imprimer colonne 1, puis colonne 2 etc..
    Les IOCTL (Input/Output ConTroLes) te permettent de contrôler ton terminal. Tu peux par exemple ne plus afficher la saisie (pour par exemple saisir un mot de passe) mais je ne me souviens pas avoir vu ça pour positionner le curseur.
    Je pense que toi, là, ce que tu cites est plutôt défini par les "codes escape" ou alors carrément par la librairie "curses"...
    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]

  9. #9
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 99
    Points : 55
    Points
    55
    Par défaut
    Attend mais s'il imprime ligne par ligne, donc premiere ligne qu'il imprime
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Applications			Users				dev				installer.failurerequests	sgoinfre
    Pourtant avec le cat -e on se retrouve avec Users bien plus loin dans les lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Applications$
    Developer$
    Library$
    Network$
    System$
    Users$
    Pourquoi?

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Parce que la personne qui a mis en place ls a décidé de proposer diverses options d'affichage selon les paramètres de l'utilisateur..
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  11. #11
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 685
    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 685
    Points : 30 974
    Points
    30 974
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par minipopov Voir le message
    Pourtant avec le cat -e on se retrouve avec Users bien plus loin dans les lignes
    Pourquoi?
    Oui pardon tu as raison. J'ai basé mon message précédent sur ta recopie du résultat dans le forum. Là il y a des tabulations et des '\n'.
    Mais sur ma machine, les colonnes sont suivies d'espaces et la dernière a des tabulations. Effectivement aucun '\n'.
    C'est pas facile à analyser parce que toute redirection (vers un fichier, un pipe) perd ce format.

    Autre chose: l'affichage s'adapte à la taille de la fenêtre (si je la réduis le nb de colonnes diminue d'autant) mais à partir d'une certaine taille, ce nb s'arrête de monter.

    Pourquoi ne pas directement aller voir le source de ls ???
    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]

  12. #12
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 99
    Points : 55
    Points
    55
    Par défaut
    mais non mais c'est la meme commande.

    Juste et . J' ai pas d'argument qui change. J'utilise pas le -1 ou je ne sais quel autre arg

  13. #13
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 685
    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 685
    Points : 30 974
    Points
    30 974
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par minipopov Voir le message
    mais non mais c'est la meme commande.
    J' ai pas d'argument qui change. J'utilise pas le -1 ou je ne sais quel autre arg
    Oui mais la commande détecte le canal de sortie. Et si c'est un périphérique mode caractère (donc un tty) elle se comporte d'une certaine manière, et sinon elle se comporte d'une autre.
    C'est aussi le cas de la commande passwd pour changer le mot de passe. Elle refuse de travailler si le input n'est pas le clavier...
    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]

  14. #14
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    J'avais mal lu, mais le raisonnement est identique : cat est une autre fonction qui découpe un afficahge sur plusieurs colonnes et les affiche sur une seule colonne. Elle est sufisament intelligente pour découper les colonnes et lignes et les réordonner correctement.
    Peut-être que ls doit suivre un format de sortie afin d'être consommée par cat (j'en suis pas convaincue), mais ton problème est-il d'afficher des colonnes, ou de transformer des colonnes en une seule ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  15. #15
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Il est possible d'encapsuler la commande dans une session typescript via script avant de l'envoyer au pipe pour visualiser la sortie « comme dans un terminal » : script -qc 'ls /' | cat -e .

  16. #16
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 99
    Points : 55
    Points
    55
    Par défaut
    Mon probleme est de comprendre on peut utiliser le man 4 tty, donc je suppose ioctl pour produire un affichage exactement identique a celui de ls

  17. #17
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 99
    Points : 55
    Points
    55
    Par défaut
    Citation Envoyé par Matt_Houston Voir le message
    Il est possible d'encapsuler la commande dans une session typescript via script avant de l'envoyer au pipe pour visualiser la sortie « comme dans un terminal » : script -qc 'ls /' | cat -e .
    Ca marche pas sur mon mac a ce qui parait. le typescrict, c'est pas du js? on a pas les meme options entre mac et linux sur la commande script sinon, moi il me renvoi un "script: ls /: No such file or directory"

  18. #18
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Non, rien à voir avec Javascript. L'implémentation de script sur OSX est peut-être légèrement différente, le man t'en diras plus.

    Je ne comprends toujours pas pourquoi tu cherches à contrôler le terminal. À la limite tu as effectivement besoin d'interroger via ioctl avec TIOCGWINSZ pour récupérer le nombre de colonnes puisque tu vises l'exact comportement de ls mais le reste (cf. premier message de Bousk) c'est de l'algo, non ?

Discussions similaires

  1. affichage de colonnes par la jonture des tables
    Par pinokio dans le forum Langage SQL
    Réponses: 1
    Dernier message: 24/04/2007, 08h27
  2. Affichage par colonne
    Par Louison dans le forum Langage SQL
    Réponses: 5
    Dernier message: 12/02/2007, 16h34
  3. [Tableaux] Creation d'un affichage en colonne et ligne
    Par fabien14 dans le forum Langage
    Réponses: 7
    Dernier message: 09/12/2006, 13h19
  4. Réponses: 7
    Dernier message: 22/09/2006, 15h52
  5. DBGrid et format d'affichage des colonnes
    Par jakouz dans le forum Composants VCL
    Réponses: 3
    Dernier message: 03/08/2005, 14h10

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