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

为什么F#中的StreamReader.ReadLine()不作为新行读取?,f#,streamreader,msdn,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”)或紧接换行符(“\r\n”)的回车符序列。返回的字符串不包含终止回车符或换行符。如果到达输入流

我当前正在尝试读取文件,如下所示:

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”)或紧接换行符(“\r\n”)的回车符序列。返回的字符串不包含终止回车符或换行符。如果到达输入流的末尾,则返回值为null


为什么我的程序不将
\n
解释为新行?

我无法重现该问题。这似乎很管用:

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

问题是,
ReadLine
的文档讨论的是
'\n'
(单个)字符,而实际上您有一个
“\\n”
两个字符串

在C#中,
\
用作转义字符-例如,
\n
表示ASCII值为10的字符。但是,文件并没有按照C#规则进行解析(这是一件好事!)。由于您的文件没有文本10个字符,因此它们不会被解释为端点,因此正确地说,ASCII中的文本翻译应该是(92110)


只需使用
Split
(或
Replace
)即可。基本上,您希望将
“\\n”
替换为
“\n”
(或者更好的是,
环境.NewLine
)。

我使用@Mark Seemann的方法,让
让s=inputStream.ReadToEnd()
直接导入您正在键入的字符串。我可以使用do while循环打印出与您相同的输出,但我必须使用此递归打印文件方法:

让rec打印文件(读卡器:System.IO.StreamReader)=
如果不是(reader.EndOfStream),则
let line=reader.ReadLine()
printfn“%s”行
打印文件读取器


但是,这并不将\n识别为新行-您知道为什么我认为这些方法非常相似吗?谢谢

您是说您有一个包含这些内容的单行文件\n?如果是,那么这些不是换行符,它们是两个字符串,看起来像我们表示换行符的方式。您需要用实际的
环境来替换“\\n”子字符串。换行符
字符串。这不是一回事;问题措辞暗示(如注释中添加的scrwtp)给定的文本是当前文件,而不是文本表示。要使用当前代码再现相同的条件,您需要转义
\n
(正如Luaan所指出的)或使用逐字字符串。
53**7****
6**195***
*98****6*
8***6***3
4**8*3**1
7***2***6
*6****28*
***419**5
****8**79