为什么F#中的StreamReader.ReadLine()不能读取\ n作为新行?

时间:2015-11-02 09:27:41

标签: f# streamreader msdn

我目前正在尝试读取文件:

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解释为新行?

3 个答案:

答案 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