Проблема с файловым вводом-выводом и разбиением строк с помощью Environment.NewLine в VB.Net - PullRequest
6 голосов
/ 10 апреля 2010

Я экспериментировал с базовыми операциями ввода-вывода файлов VB.Net и расщепления строк. Я столкнулся с этой проблемой. Я не знаю, имеет ли это какое-то отношение к разделению файлов или вводу строк.

Я пишу текст в файл примерно так

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.

Таким образом, при разбиении в качестве разделителя используется только символьный эквивалент значения 13 ASCII, который является первым символом NewLine, как объясняется в ответах, а оставшийся материал все еще присутствует в строках. По какой-то причине загадочное пустое пространство в приведенном выше списке и значение ASCII 10 вместе приводят к печати новой строки.

Теперь понятно. Спасибо за помощь. :)

Ответы [ 3 ]

6 голосов
/ 10 апреля 2010

Прежде всего, да, 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)

Это приведет к тому, что он будет разбит на фактическую строку, а не на первый символ, как это происходит сейчас, и удалит все пустые записи из результатов.

3 голосов
/ 11 апреля 2010

Почему бы просто не использовать File.ReadAllLines ? Один вызов читает файл и возвращает строковый массив со строками.

Dim tempStr() As String = File.ReadAllLines("data.txt")
0 голосов
/ 15 ноября 2011

Я только что столкнулся с той же проблемой и нашел все комментарии очень полезными. Однако я исправил свою проблему, заменив «Environment.NewLine» на vbLF (в отличие от vbCrLf, у которого возникла та же проблема). Есть проблемы с этим подходом? (Кажется, это более прямолинейно, но я не программист, поэтому я не знаю о каких-либо потенциальных проблемах).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...