为什么 StringReader 读取 '\uffff'?
Why does StringReader read '\uffff'?
我正在编写一种我自己的语言,叫做 SPL。它有一个从 ISplRuntime.Input
属性(它是 TextReader
)读取输入的输入命令。此界面上的所有其他命令 运行 因为这样我可以只用一个库编写不同的应用程序!
然后我编写了另一个控制台应用程序来测试我的语言。这是我对 ISplRuntime
的实现。关注 Input
和构造函数:
public class MyRuntime : ISplRuntime {
protected TextReader reader;
protected bool stopped;
public object Current {
get;
set;
}
public virtual TextReader Input {
get {
return reader;
}
}
public object[] Memory {
get;
protected set;
}
public TextWriter Output {
get {
return Console.Out;
}
}
public bool Stopped {
get {
return stopped;
}
set {
stopped = value;
if (value) {
Console.WriteLine ();
Console.WriteLine ("Program has finished");
}
}
}
public void ShowErrorMessage (string error) {
Console.WriteLine (error);
}
public MyRuntime () {
string s = Console.ReadLine ();
reader = new StringReader (s);
stopped = false;
Memory = new object[20];
}
}
构造运行时间时,它要求输入。并使用该输入在 Input
属性 中创建 StringReader
和 return。所以每次输入只会是一个lline。
然后我用 SPL 写了一个程序来输出输入。这就是问题所在!当我输入 1 1 1 1 时,它会打印 1 1 1 并抛出一个 FormatException
。这就是我读取数字输入的方式:
private bool ReadFromInput (ISplRuntime runtime, out int i) {
char stuffRead = (char)runtime.Input.Peek ();
if (stuffRead == ' ') {
i = 0;
runtime.Input.Read ();
return true;
}
if (char.IsNumber (stuffRead)) {
string numberString = "";
while (char.IsNumber (stuffRead)) {
stuffRead = (char)runtime.Input.Read ();
numberString += stuffRead;
}
i = Convert.ToInt32 (numberString); //This is where the exception occured! (Obviously, because there is no other methods that would throw it)
return true;
} else {
i = 0;
return false;
}
}
参数runtime
就是你刚刚看到的运行时间。如果成功读取数字,则 return 为真。而那个数字就是输出参数i
.
使用Visual Studio中的"Watch" window后,发现抛出异常时数字串是"1\uffff"
。这就是它抛出它的原因!我知道(认为)'\uffff'
是行尾字符。但为什么它会出现在我的输入中?我知道(认为)按 Ctrl + Z 会结束一行,但我没有!然后我在手表window里查看了runtime.Input
。这是结果:
我看到有一个名为 _s
的字段,我认为这是我告诉它读取的字符串。看? _s
连'\uffff'
都没有,怎么读出来的?
P.S。我已经知道解决方案了。我只需要稍微更改 while
循环就可以了。但我想知道为什么它读取行尾。
这里没有谜团 - \uffff
是由您的代码生成的。您只需要阅读文档并了解您调用的方法是什么 return.
Return Value
Type: System.Int32
An integer representing the next character to be read, or -1 if no more characters are available or the reader does not support seeking.
Return Value
Type: System.Int32
The next character from the text reader, or -1 if no more characters are available.
希望您看到 -1
(0xffffffff
) 和 \uffff
之间的关系。
我正在编写一种我自己的语言,叫做 SPL。它有一个从 ISplRuntime.Input
属性(它是 TextReader
)读取输入的输入命令。此界面上的所有其他命令 运行 因为这样我可以只用一个库编写不同的应用程序!
然后我编写了另一个控制台应用程序来测试我的语言。这是我对 ISplRuntime
的实现。关注 Input
和构造函数:
public class MyRuntime : ISplRuntime {
protected TextReader reader;
protected bool stopped;
public object Current {
get;
set;
}
public virtual TextReader Input {
get {
return reader;
}
}
public object[] Memory {
get;
protected set;
}
public TextWriter Output {
get {
return Console.Out;
}
}
public bool Stopped {
get {
return stopped;
}
set {
stopped = value;
if (value) {
Console.WriteLine ();
Console.WriteLine ("Program has finished");
}
}
}
public void ShowErrorMessage (string error) {
Console.WriteLine (error);
}
public MyRuntime () {
string s = Console.ReadLine ();
reader = new StringReader (s);
stopped = false;
Memory = new object[20];
}
}
构造运行时间时,它要求输入。并使用该输入在 Input
属性 中创建 StringReader
和 return。所以每次输入只会是一个lline。
然后我用 SPL 写了一个程序来输出输入。这就是问题所在!当我输入 1 1 1 1 时,它会打印 1 1 1 并抛出一个 FormatException
。这就是我读取数字输入的方式:
private bool ReadFromInput (ISplRuntime runtime, out int i) {
char stuffRead = (char)runtime.Input.Peek ();
if (stuffRead == ' ') {
i = 0;
runtime.Input.Read ();
return true;
}
if (char.IsNumber (stuffRead)) {
string numberString = "";
while (char.IsNumber (stuffRead)) {
stuffRead = (char)runtime.Input.Read ();
numberString += stuffRead;
}
i = Convert.ToInt32 (numberString); //This is where the exception occured! (Obviously, because there is no other methods that would throw it)
return true;
} else {
i = 0;
return false;
}
}
参数runtime
就是你刚刚看到的运行时间。如果成功读取数字,则 return 为真。而那个数字就是输出参数i
.
使用Visual Studio中的"Watch" window后,发现抛出异常时数字串是"1\uffff"
。这就是它抛出它的原因!我知道(认为)'\uffff'
是行尾字符。但为什么它会出现在我的输入中?我知道(认为)按 Ctrl + Z 会结束一行,但我没有!然后我在手表window里查看了runtime.Input
。这是结果:
我看到有一个名为 _s
的字段,我认为这是我告诉它读取的字符串。看? _s
连'\uffff'
都没有,怎么读出来的?
P.S。我已经知道解决方案了。我只需要稍微更改 while
循环就可以了。但我想知道为什么它读取行尾。
这里没有谜团 - \uffff
是由您的代码生成的。您只需要阅读文档并了解您调用的方法是什么 return.
Return Value
Type: System.Int32
An integer representing the next character to be read, or -1 if no more characters are available or the reader does not support seeking.
Return Value
Type: System.Int32
The next character from the text reader, or -1 if no more characters are available.
希望您看到 -1
(0xffffffff
) 和 \uffff
之间的关系。