我正在尝试基本的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一起导致打印一个新行。
现在很清楚。谢谢您的帮助。 :)
答案 0 :(得分:6)
首先,是的,WriteLine
在字符串末尾的换行符上添加,因此最后是空行。
问题在于您拨打fileContents.Split()
的方式。该函数的唯一版本只需要一个参数需要char()
,而不是string
。 Environment.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,它有相同的问题)。这种方法有什么问题吗? (看起来更直接,但我不是程序员,所以我不知道任何潜在的问题。)