读取已打印到控制台的值

时间:2016-01-21 09:42:53

标签: c# console

这可能完全不可能,但我想知道是否有办法读取控制台已经打印的值。例如,如果控制台打印

  

您以10米/秒的速度向北行驶

作为Console.WriteLine("You are travelling north at a speed of 10m/s");的结果,有没有办法读取这一行,然后,为了论证,将这个值放在一个字符串中?

基本上我需要的是读取已经输出到控制台的内容,而不是用户输入。有办法吗?

提前致谢。

4 个答案:

答案 0 :(得分:7)

是。有一种方法。你可以Console.SetOut方法。

将您的主要方法组织为;

static void Main()
{
    using (StringWriter stringWriter = new StringWriter())
    {
         Console.SetOut(stringWriter);

         //All console outputs goes here
         Console.WriteLine("You are travelling north at a speed of 10m/s");

         string consoleOutput = stringWriter.ToString();
    }
}

然后consoleOutput应该有You are travelling north at a speed of 10m/s

答案 1 :(得分:3)

如果您仍希望输出到控制台,可以使用Console.SetOut并同时为其指定两个目的地,一个是主控制台窗口,另一个是内部存储。

您可以编写一个简单的帮助程序类:

public class OutputCapture : TextWriter, IDisposable
{
    private TextWriter stdOutWriter;
    public TextWriter Captured { get; private set; }
    public override Encoding Encoding { get { return Encoding.ASCII; } }

    public OutputCapture()
    {
        this.stdOutWriter = Console.Out;
        Console.SetOut(this);
        Captured = new StringWriter();
    }

    override public void Write(string output)
    {
        // Capture the output and also send it to StdOut
        Captured.Write(output);
        stdOutWriter.Write(output);
    }

    override public void WriteLine(string output)
    {
        // Capture the output and also send it to StdOut
        Captured.WriteLine(output);
        stdOutWriter.WriteLine(output);
    }
}

然后在您的主代码中,您可以包装您的语句,如下所示:

void Main()
{
    // Wrap your code in this using statement...
    using (var outputCapture = new OutputCapture())
    {
        Console.Write("test");
        Console.Write(".");
        Console.WriteLine("..");
        Console.Write("Second line");
        // Now you can look in this exact copy of what you've been outputting.
        var stuff = outputCapture.Captured.ToString();
    }
}

您可以将其更改为具有多个目的地,因此您可以创建类似List<string>的内部商店,如果您愿意的话。

背景:当我想让我的NHibernate查询输出到LINQPad的SQL Output选项卡中时,我在这些方面做了一些事情(虽然我没有保留输出的副本)。我在这里写了这篇文章(还有一个Github repo和NuGet包):https://tomssl.com/2015/06/30/see-your-sql-queries-when-using-nhibernate-with-linqpad/

答案 2 :(得分:0)

除非是用户输入,否则从控制台读取值通常是个坏主意。您应该将值放入变量中,或者如果您需要在以后读取它,请将其保存到文件中。

String a = "You are travelling north at a speed of 10m/s"
Console.WriteLine(a);
//Do anything you want with variable 'a'

答案 3 :(得分:0)

如果要将正在写入的内容保存到控制台,请先将其存储在String变量中,然后将此变量的内容打印到控制台,如下所示:

String consoleOutput = "You are travelling north at a speed of 10m/s"
Console.WriteLine(consoleOutput);

这样您就可以随时访问consoleOutput。