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

时间:2010-04-10 14:33:56

标签: 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 As New StreamReader("Data.txt")
Dim fileContents As String = sReader.ReadToEnd()
sReader.Close()

现在,我使用fileContents作为分隔符来分割Environment.NewLine

Dim tempStr() As String = fileContents.Split(Environment.NewLine)

当我打印生成的数组时,我得到了一些奇怪的结果

For Each str As String In tempStr
  Console.WriteLine("*" + str + "*")
Next

我在打印过程中将* s添加到数组项的开头和结尾,以了解发生了什么。由于NewLine被用作分隔符,我期望数组中的字符串不具有任何NewLine。但输出是这个 -

*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

似乎'Environment.NewLine'由

组成
 - 13

 - 10
13和10 ..我明白了。但两者之间的空白?我不知道它是否因打印到控制台而来,或者真的是NewLine的一部分。

因此,在拆分时,只使用等价于ASCII值13的字符(即NewLine的第一个字符)作为分隔符(如回复中所述),其余内容仍然存在于字符串中。由于某种原因,上面列表中的神秘空白空间和ASCII值10一起导致打印一个新行。

现在很清楚。谢谢您的帮助。 :)

3 个答案:

答案 0 :(得分:6)

首先,是的,WriteLine在字符串末尾的换行符上添加,因此最后是空行。

问题在于您拨打fileContents.Split()的方式。该函数的唯一版本只需要一个参数需要char(),而不是stringEnvironment.NewLine是一个字符串,而不是char,因此(假设您有Option Strict Off)当您调用该函数时,它会隐式将其转换为char,仅使用字符串中的第一个字符。这意味着,不是将字符串拆分为构成Environment.NewLine的两个字符的实际序列,而是实际上只拆分第一个字符。

要获得所需的输出,您需要像这样调用它:

Dim delims() as String = { Environment.NewLine }
Dim tempStr() As String = fileContents.Split(delims, _
                          StringSplitOptions.RemoveEmptyEntries)

这将导致它分割为实际字符串,而不是现在正在执行的第一个字符,它将从结果中删除任何空白条目。

答案 1 :(得分:3)

为什么不使用File.ReadAllLines?一次调用读取文件并返回带有这些行的字符串数组。

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

答案 2 :(得分:0)

我刚遇到同样的问题,发现所有评论都非常有帮助。但是,我通过用vbLF替换“Environment.NewLine”来纠正了我的问题(而不是vbCrLf,它有相同的问题)。这种方法有什么问题吗? (看起来更直接,但我不是程序员,所以我不知道任何潜在的问题。)