我目前正在尝试读取文件:
53**7****\n6**195***\n*98****6*\n8***6***3\n4**8*3**1\n7***2***6\n*6****28*\n***419**5\n****8**79\n
并将其写入屏幕,但使用新行代替/ n。
在方法StreamReader.ReadLine()的msdn描述中,它说: 一行被定义为一个字符序列,后跟一个换行符(" \ n"),一个回车符(" \ r"),或一个回车后面紧跟一行feed(" \ r \ n")。返回的字符串不包含终止回车符或换行符。如果到达输入流的末尾,则返回值为null。
为什么我的程序不会将\n
解释为新行?
答案 0 :(得分:1)
嗯,问题是'\n'
的文档正在讨论"\\n"
(单个)字符,而实际上有一个\
双字符字符串。
在C#中,\n
用作转义字符 - 例如,Split
表示ASCII值为10的字符。但是,文件不根据C#规则(这是件好事!)。由于您的文件没有文字10个字符,因此它们不会被解释为结束语,这是正确的 - ASCII中的字面翻译将是(92,110)。
只需使用Replace
(或"\\n"
),您就可以了。基本上,您希望将"\n"
替换为Environment.NewLine
(或更好,selenium
)。
答案 1 :(得分:1)
我通过让let s = inputStream.ReadToEnd ()
使用@Mark Seemann的方法,从而直接导入您输入的字符串。我可以使用do-while循环打印出与你相同的输出,但我必须使用这种递归的printFile方法:
let rec printFile (reader : System.IO.StreamReader) =
if not(reader.EndOfStream) then
let line = reader.ReadLine ()
printfn "%s" line
printFile reader
然而,这并没有将\ n识别为新行 - 你知道为什么我认为这些方法非常相似吗?谢谢!
答案 2 :(得分:-1)
我无法重现这个问题。这似乎工作正常:
let s = "53**7****\n6**195***\n*98****6*\n8***6***3\n4**8*3**1\n7***2***6\n*6****28*\n***419**5\n****8**79\n"
open System.IO
let strm = new MemoryStream()
let sw = new StreamWriter(strm)
sw.Write s
sw.Flush ()
strm.Position <- 0L
let sr = new StreamReader(strm)
while (not sr.EndOfStream) do
let line = sr.ReadLine ()
printfn "%s" line
打印
53**7****
6**195***
*98****6*
8***6***3
4**8*3**1
7***2***6
*6****28*
***419**5
****8**79