VB.Net中文件IO和使用Environment.NewLine拆分字符串的问题

VB.Net中文件IO和使用Environment.NewLine拆分字符串的问题,vb.net,string,file-io,Vb.net,String,File Io,我正在试验基本的VB.Net文件IO和字符串拆分。我遇到了这个问题。我不知道这是否与文件IO或字符串拆分有关 我正在向这样的文件写入文本 Dim sWriter As New StreamWriter("Data.txt") sWriter.WriteLine("FirstItem") sWriter.WriteLine("SecondItem") sWriter.WriteLine("ThirdItem") sWriter.Close() 然后,我从文件中读取文本 Dim sReader A

我正在试验基本的VB.Net文件IO和字符串拆分。我遇到了这个问题。我不知道这是否与文件IO或字符串拆分有关

我正在向这样的文件写入文本

Dim sWriter As New StreamWriter("Data.txt")
sWriter.WriteLine("FirstItem")
sWriter.WriteLine("SecondItem")
sWriter.WriteLine("ThirdItem")
sWriter.Close()
然后,我从文件中读取文本

Dim sReader As New StreamReader("Data.txt")
Dim fileContents As String = sReader.ReadToEnd()
sReader.Close()
现在,我使用
Environment.NewLine
作为分隔符拆分
fileContents

Dim tempStr() As String = fileContents.Split(Environment.NewLine)
当我打印结果数组时,会得到一些奇怪的结果

For Each str As String In tempStr
  Console.WriteLine("*" + str + "*")
Next
在打印过程中,我将*s添加到数组项的开头和结尾,以了解发生了什么。由于
换行符
用作分隔符,我希望数组中的字符串没有任何换行符。但结果是:

*FirstItem*
*
SecondItem*
*
ThirdItem*
*
*
不应该是这样吗-

*FirstItem*
*SecondItem*
*ThirdItem*
**
?

为什么除了第一个字符串外,所有字符串的开头都有新行

更新:我逐字打印了
fileContents
,得到了这个-

F - 70
i - 105
r - 114
s - 115
t - 116
I - 73
t - 116
e - 101
m - 109
 - 13

 - 10
S - 83
e - 101
c - 99
o - 111
n - 110
d - 100
I - 73
t - 116
e - 101
m - 109
 - 13

 - 10
T - 84
h - 104
i - 105
r - 114
d - 100
I - 73
t - 116
e - 101
m - 109
 - 13

 - 10
“环境新线”似乎包括

 - 13

 - 10
13和10。。我理解。但是中间的空白呢?我不知道它是因为打印到控制台,还是真的是新行的一部分

因此,在拆分时,只有与ASCII值13等效的字符(它是
换行符的第一个字符)用作分隔符(如回复中所述),剩余的内容仍然存在于字符串中。出于某种原因,上面列表中神秘的空白和ASCII值10一起导致打印新行


现在很清楚了。谢谢你的帮助。:) WordNeal[/Cords]在一个换行到字符串末尾的TACK,因此在结尾的空白行。< /P> 问题在于调用
fileContents.Split()
的方式。该函数只有一个参数的唯一版本使用的是
char()
,而不是
字符串
Environment.NewLine
是一个字符串,而不是
char
,因此(假设您有
选项Strict Off
)在调用函数时,它只使用字符串中的第一个字符将其隐式转换为
char
。这意味着,它不是按照构成
Environment.NewLine
的两个字符的实际序列分割字符串,而是实际上只对其中的第一个字符进行分割

要获得所需的输出,需要如下调用:

Dim delims() as String = { Environment.NewLine }
Dim tempStr() As String = fileContents.Split(delims, _
                          StringSplitOptions.RemoveEmptyEntries)
这将导致它在实际字符串上拆分,而不是像现在这样在第一个字符上拆分,并将从结果中删除任何空白项。

为什么不直接使用?一个调用读取文件并返回一个带有行的字符串数组

Dim tempStr() As String = File.ReadAllLines("data.txt")

我只是遇到了同样的问题,发现所有的评论都非常有用。但是,我纠正了我的问题,用vbLF替换了“Environment.NewLine”(与vbCrLf相反,后者有相同的问题)。这种方法有什么问题吗?(这似乎更直截了当,但我不是程序员,所以我不知道任何潜在的问题)。

顺便说一句,这不完全正确,它只使用字符串的第一个字符,将所有字符保留在拆分的字符串中。或者还是老一套地使用拆分(fileContents,vbNewLine)@克里斯:这将在所有字符串的末尾留下一个无用的
CR
字符。@Chris,@Adam。克里斯是对的。
vbNewLine
常量为
CRLF
,VB
Split
函数允许多字符delimeters,因此Chris的建议将删除
CR
LF
@MarkJ:我明白了,Chris建议使用VB特有的分割函数。通常不鼓励使用特定于语言的类型和函数(例如
Split
vbNewLine
)。它们的语言只是为了使移植遗留代码的工作更容易;新的开发应该利用标准的BCL类型和功能。字符13是回车符,10是换行符。这就是为什么它在结果中显示为空行,因为它正在打印新行。如果一个答案回答了你的问题,请务必接受它:)嘿。。啊哼。。谢谢:D:DHi,是的。。我一开始就用这个。但当问题发生时,我认为我做的文件IO错误。我想确定问题不是我读写文件的方式,所以我转向了StreamReader和StreamWriter(我从早期的编码经验中熟悉的东西)。我忘了换回去。无论如何,谢谢你的建议:)