所以我正在创建一个应用程序,我必须使用Console.Read,因为我希望在某个事件中重写该行,所以我不能使用Console.ReadLine()。问题是我的应用程序不输出字符串,而是输出多行数字。我试过这行代码。如果您需要更多代码示例,请发表评论。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
namespace einuorg_console
{
class UDPserver
{
private static string DatePattern = "HH:mm:ss";
public static void Initialize(string IPaddress, int port)
{
Boolean done = false;
Boolean exception_thrown = false;
Socket sending_socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPAddress sendto_address = IPAddress.Parse(IPaddress);
IPEndPoint sending_endpoint = new IPEndPoint(sendto_address, port);
Console.Write("[" + DateTime.Now.ToString(DatePattern) + "] ");
Console.WriteLine("einuorg.UDPserver Initialized on address " + IPaddress + ":" + port.ToString());
while (!done)
{
Console.Write("[********]");
string text_to_send = Console.Read().ToString();
if (text_to_send.Length == 0)
{
done = true;
}
else
{
byte[] sendbuffer = Encoding.ASCII.GetBytes(text_to_send);
try
{
sending_socket.SendTo(sendbuffer, sending_endpoint);
}
catch (Exception send_exception)
{
exception_thrown = true;
Console.WriteLine(" Exception {0}", send_exception.Message);
}
if (exception_thrown == false)
{
Console.WriteLine("\r");
Console.Write("[" + DateTime.Now.ToString(DatePattern) + "] ");
Console.WriteLine(text_to_send);
}
else
{
exception_thrown = false;
Console.WriteLine("The exception indicates the message was not sent.");
}
}
}
}
}
}
终端类似于Console类,但有更多选项,我构建的东西。
答案 0 :(得分:1)
Console.Read返回一个Int32:" [t]来自输入流的下一个字符,如果当前没有更多字符要读取,则返回负一(-1)。"当你写作时,你只是在该值上调用ToString
,所以你除了数字之外什么也看不见。您需要检查返回值是否为-1,如果不是则转换为char
。
还有一个Console.ReadKey方法,它为您提供一个包含KeyChar属性的对象。它可能更容易使用。
根据您的评论,您可能会遇到类似的事情:
public static string ReadLine()
{
bool done = false;
StringBuilder sb = new StringBuilder();
while (!done)
{
ConsoleKeyInfo key = Console.ReadKey(true);
switch(key.Key)
{
case ConsoleKey.Enter:
done = true;
break;
case ConsoleKey.Backspace:
sb.Length -= 1;
Console.Write(key.KeyChar);
Console.Write(" ");
Console.Write(key.KeyChar);
break;
default:
sb.Append(key.KeyChar);
Console.Write(key.KeyChar);
break;
}
}
}
return sb.ToString();
}
该功能可能会被清理一下。它可能不会用于箭头键。它会将您的Console.Read行替换为:
string text_to_send = ReadLine();
这会在用户输入后离开当前行,因为Enter键永远不会回显到控制台。之后,您可以执行覆盖逻辑并在闲暇时移动到下一行。
作为替代方案,您可以使用Console.ReadLine,然后将光标向上调整一行:
public static string ReadLine2()
{
string input = Console.ReadLine();
Console.CursorTop -= 1;
return input;
}