Je veux savoir s'il est possible en C # d'empêcher la console de créer de nouvelles lignes à partir de longues chaînes et de masquer plutôt simplement le texte qui dépasse la largeur de la fenêtre.

Par exemple, lorsque je crée de longues chaînes, le résultat serait le suivant:

Blah blah blah, word stuff, word stuff, bl | <-- Window width
ah blah blah.                              | <-- Window width

Je veux que ce soit comme ça:

Blah blah blah, word stuff, word stuff, bl | <-- Window width
                                           | <-- Window width
c#
1
Moon Jaspers 21 avril 2017 à 06:00

3 réponses

Meilleure réponse

Vous pouvez le faire en interceptant la sortie standard Console.

Le code ci-dessous est juste pour vous aider à démarrer. Si vous avez besoin de prendre en charge les tabulations, le positionnement aléatoire du curseur, des mélanges de fins de ligne (par exemple \ r \ n et \ n et \ r), alors cela peut nécessiter plus de travail.

ConsoleTruncator vous permet de définir la "maxlinelength" qui contrôle le nombre maximum de caractères sur chaque ligne - cela n'arrête pas le wrapping si la largeur de la fenêtre de la console a été réduite au-dessous de cette valeur "maxlinelength".

Donc à la place, vous pouvez utiliser quelque chose comme ceci pour "suivre" la largeur de la console (bien proche de):

bool bRoom = (Console.WindowWidth - 1 - m_columnposition) > 0;

Pour de simples Write, et WriteLines, je pense que ça devrait aller.

Une manière plus avancée de le faire serait de capturer toute la sortie de la console, de mettre en mémoire tampon et de suivre tout cela, puis de la réécrire en utilisant Console.SetCursorPosition et Console.Write.

using System;
using System.IO;
using System.Text;

namespace ConsoleApp5
{
    public class ConsoleTruncator : TextWriter
    {
        TextWriter m_console;

        int m_maxlinelength;
        int m_columnposition;

        public ConsoleTruncator(int maxlinelength)
        {
            m_maxlinelength = maxlinelength;

            m_console = Console.Out; // save console stream reference between we replace it

            Console.SetOut(this); // redirect console to this TextWriter

            // (don't do the `SetOut` here ... you need to separate out the
            // the attach and detach of the custom `TextWriter` to the
            // console into some other utility class/helper...for good structure)
        }

        public override Encoding Encoding
        {
            get
            {
                return Encoding.UTF8;
            }
        }

        public override void Write(char value)
        {
            if (value == '\r')
                return;

            if (value == '\n')
            {
                OutputChar(value);

                m_columnposition = 0;
            }
            else
            {
                bool bRoom = (m_maxlinelength - m_columnposition) > 0;

                if (bRoom)
                {
                    OutputChar(value);

                    m_columnposition++;
                }
            }

        }

        private void OutputChar(char value)
        { 
            m_console.Write(value);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            string[] somelines =
            {
                "AAALorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam auctor neque quis euismod auctor. Fusce massa nibh, fringilla eu mi ornare, ullamcorper tristique nibh. Aenean eget neque111",
                "BBBxxxxxxxx vvvvvvvvvvvvvvvvvvv xxxxxxxxxxxxxxxxx222",
                "CCCNullam porta eu magna eget rutrum. Aenean orci urna, pretium ut odio vitae, euismod rhoncus ligula. Vivamus condimentum semper lacus id tempor. Phasellus at turpis a quam ornare tincidunt. Vivamus eleifend quam eget velit porttitor, sit amet laoreet risus consectetur. Mauris eu arcu sit amet ipsum vulputate porttitor. Phasellus elementum erat eu blandit semper. Integer eu metus urna. Pellentesque at posuere purus. Nu333",
                "0123456789 0123456789 0123456789 0123456789 0123456789 0123456789\r\n0123456789+*+*+*+*+*0123456789+*+*+*+*+*0123456789",
                "abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz\r\n\r\nABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ"
            };

            using (var consoleTruncator = new ConsoleTruncator(40))
            {
                foreach(string s in somelines)
                {
                    Console.WriteLine(s);
                }

                Console.WriteLine();
                Console.Write("write a bit");
                Console.Write("-write a bit more");
                Console.Write("-write too muchhhhhhhhhhhhhhhh");
            }

            Console.ReadKey();
        }
    }
}

enter image description here

1
Colin Smith 22 avril 2017 à 04:32

Vous pouvez le faire en ajustant la largeur de la taille du tampon d'écran de la fenêtre de la console:

enter image description here

Pour l'ajuster par programme, vous pouvez appeler:

 //Any value greater than 80:
 Console.BufferWidth = 120;
0
Willy David Jr 21 avril 2017 à 03:13

Le meilleur moyen est d'utiliser buffsize, comme ceci:

int windowWidth = Console.WindowWidth;
string str = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
Console.Write(str.ToCharArray(), 0, windowWidth);

Une autre façon est le bricolage. C'est un peu difficile à faire, mais vous pouvez le faire en suivant les étapes suivantes: 1. Obtenir la taille actuelle de la fenêtre

int windowWidth = Console.WindowWidth;

2. Obtenez la longueur d'affichage de la chaîne actuelle, elle est liée à votre police

Font font = new Font(FontFamily.GenericSansSerif, 11);
var size = TextRenderer.MeasureText(str, font).Width;

3. Utilisez les 2 valeurs pour couper la corde et afficher la 1ère partie.

Mais c'est très compliqué.

1
Justin Shi 21 avril 2017 à 03:27