#vb.net
#vb.net
Вопрос:
Я пытаюсь написать программу, которая будет подсчитывать количество имен после слова «Патти» из файла.
Private Sub btnP_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnP.Click
Dim inFile As StreamReader = New StreamReader("pattiparty.txt")
'Declare the varibles
Dim variableName As String ' the current names from the file
Dim names As String
Do
'read in the names
variableName = inFile.ReadLine()
'determine the two consecutive names after Patti
If variableName = "Patti" Then
names = variableName 2
End If
Loop Until variableName = "Patti"
'the loop keeps going until "Patti" is read
'output the results
Me.lblOutput.Text = names
End Sub
Конечный класс
Вместо этого программа должна отображать два имени после имени «Патти», но вместо этого я получаю сообщение об ошибке.
Комментарии:
1. Вы не предоставили образец входного файла, который должен воспроизводить это поведение.
2. Включите
Option Strict On
на уровне проекта…3. Предоставьте образец входного файла, а другой показывает, какими должны быть результаты.
Ответ №1:
Итак, вы захотите продолжить цикл до тех пор, пока не будет прочитана как а) целевая строка «Patti», так и б) будут прочитаны следующие 2 строки или достигнут конец файла. После распознавания имени «Патти» вы можете установить флаг foundName = true
и для каждой следующей строки увеличивать количество дополнительных прочитанных имен, пока не будут прочитаны оба или не будет достигнут конец строки.
Ответ №2:
С variableName = inFile.ReadLine()
помощью, вы считываете строковое значение, таким образом, с помощью: names = variableName 2
, вы пытаетесь добавить Integer
значение 2
к строковому значению. Нет действительно полезного.
Вам нужно прочитать каждую строку файла и начать добавлять строковые значения в переменную / коллекцию, когда будет найден определенный шаблон. Затем решите, сколько еще строк нужно прочитать из файла.
Итак, это: Loop Until variableName = "Patti"
не поможет, вы выйдете из цикла, как только скороговорка будет найдена, и вы никогда не получите следующие строки.
Конечно, тем временем вы, возможно, достигли конца файлового потока. Или, возможно, указанный вами шаблон не был найден.
Простое решение — использовать логические флаги, значение которых устанавливается True
, как только шаблон найден, а затем собирать указанное количество строк, если таковые имеются, только тогда, когда установлен флаг True
. Выйдите из цикла, когда соберете то, что было запрошено.
Это While Not (reader.EndOfStream)
условие гарантирует, что мы не будем читать дальше конца потока.
Последнее, что нужно сделать, это добавить найденные строки в свойство Text элемента управления, отвечающего за представление результатов. Здесь я использую String .Join() для склеивания полученных строк, разделенных пробелом.
Private Sub btnP_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnP.Click
Dim pattiResults = FileGetLines("pattiparty.txt", "Patti", 2)
Me.lblOutput.Text = String.Join(" ", pattiResults)
End Sub
Friend Function FileGetLines(filePath As String, searchPatter As String, linesCount As Integer) As List(Of String)
Dim patternFound As Boolean = False
Dim result As New List(Of String)
Using reader As StreamReader = New StreamReader(filePath)
While Not (reader.EndOfStream)
If reader.ReadLine().Contains(searchPatter) Then patternFound = True
If patternFound Then
result.Add(reader.ReadLine())
If result.Count = linesCount Then
Exit While
End If
End If
End While
End Using
Return result
End Function