Чтение текстового файла в массив ничего не дает при нажатии кнопки Отправки

#vb.net

#vb.net

Вопрос:

Мне нужна эта программа, чтобы countries.txt файл и считайте его в country.countryarray при загрузке программы. Затем пользователь должен иметь возможность ввести название страны в поле nmtext.text и нажать кнопку отправить, а аббревиатура страны должна быть извлечена из массива и отображена в поле abbrevtext.text и выполнить то же действие, если пользователь ищет аббревиатуру в поле abbrevtext.text, затем ему необходимоотобразите название страны в поле nmtext.text.

countries.txt файл содержит 250 стран и должен быть сохранен в отладочном файле для проекта, а содержимое файла выглядит примерно так при просмотре в notepad с возвратом каретки в конце каждой строки.

 0.AC
1.Ascension Island
2.AD
3.Andorra
4.AE
5.United Arab Emirates
6.AF
7.Afghanistan
8.AG
9.Antigua and Barbuda
10.AI
  

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

 Imports System.IO
Imports Microsoft.VisualBasic.FileIO
Public Class CountForm

'CREATES STRUCTURE AND ARRAY
Public Structure Countries
    Public CountryArray
    Public CountryString As String
End Structure

'CREATES OBJECT FOR STRUCTURE
Public Country As Countries

'CREATES STREAM READER
Private MyStreamReader As System.IO.StreamReader

'CREATES FILESTRING VARIALE TO REFERENCE THE FILE PATH 
Public FileString As String      = "C:UsersUserDesktopBasicCountryFileCountryFilebinDebugCountries.Txt"

'CREATES TEXTFIELDPARSER AND REFERENCES FILESTRING TO CALL THE FILEPATH
Private TextFieldParser As New TextFieldParser(FileString)


Private Sub CountForm_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

    Try
        Country.CountryArray = File.ReadAllText(FileString) '// gets all the text in the file'

    Catch ex As Exception
        Dim ResponseDialogResult As String
        ' File missing.
        ResponseDialogResult = MessageBox.Show("Something Went Wrong",
        "Debuging Purposes", MessageBoxButtons.OK,
        MessageBoxIcon.Question)

        If ResponseDialogResult = DialogResult.Yes Then


        End If
        If ResponseDialogResult = DialogResult.No Then
            ' Exit the program.
            Me.Close()
        End If
    End Try
End Sub

Private Sub Submit_Click(sender As System.Object, e As System.EventArgs) Handles Submit.Click
    Try

        TextFieldParser.TextFieldType = FieldType.Delimited
        TextFieldParser.SetDelimiters(Environment.NewLine)

        Do Until MyStreamReader.Peek = -1
            If NmText.Text.ToUpper.Contains(Country.CountryArray.ToUpper()) Then
                AbbrevText.Text = Country.CountryArray.ToUpper - 1
            Else
                MessageBox.Show("Name or Abbreviation Was Not Found", "Error",     MessageBoxButtons.OK)
            End If

        Loop
    Catch ex As Exception

    End Try
End Sub


Private Sub Clear_Click(sender As System.Object, e As System.EventArgs) Handles Clear.Click
    NmText.Text = ""
    AbbrevText.Text = ""
End Sub
End Class
  

Комментарии:

1. Избавьтесь от этого пустого try / catch и, возможно, вы увидите, какое исключение возникает. Никогда не скрывайте исключения.

2. Спасибо сделал это, и теперь он помечает несколько вещей. Извините, код неаккуратный, я возился с ним уже несколько часов и попробовал несколько разных способов заставить его работать. Сообщая мне, что environment.newline не является приемлемым разделителем. Я сделал это так, потому что в текстовом файле в конце каждой строки есть cr. Есть идеи, как это исправить?

3. @user2796618 вместо среды. Для перевода строки попробуйте использовать одно из следующих действий: vbcrlf , vbcr , или vblf . Возможно, вы получаете ошибку, потому что окружающая среда зависит от настроек операционной системы компьютера, на котором выполняется код.

4. С кодом много проблем. Я не могу понять цель MyStreamReader , но она не инициализируется в предоставленном вами коде ( Private MyStreamReader As System.IO.StreamReader не создает экземпляр). Кроме того, все, что вы когда-либо делаете с этим Peek , для меня выглядит так, что это просто приведет к бесконечному циклу Submit_Click . Кроме того, место, в котором вы читаете файл CountForm_Load , Country.CountryArray не является массивом. Возможно, для начала неплохо было бы добавить Option Strict On и Option Explicit On в верхней части файла, чтобы указать на некоторые основные ошибки.

Ответ №1:

Подход StreamReader / TextFieldParser кажется действительно сложным. Может быть, это работает для вас:

 Public Class Form1

    Private countryDict As New Dictionary(Of String, String)

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Dim lineArray = IO.File.ReadAllLines("countries.txt")

        'this will cause trouble if there is a NewLine at the end of the file
        'In this case just remove the last new line.
        For index = 0 To lineArray.Length - 2 Step 2
            countryDict.Add(lineArray(index), lineArray(index   1))
        Next

    End Sub

    Private Sub Submit_Click(sender As System.Object, e As System.EventArgs) Handles Submit.Click
        If countryDict.ContainsKey(NmText.Text.ToUpper()) Then
            AbbrevText.Text = countryDict(NmText.Text.ToUpper())
        Else
            MsgBox("Name or Abbreviation Was Not Found")
        End If
    End Sub

End Class
  

Комментарии:

1. Я должен использовать StreamReader для удовлетворения требований, и я согласен, что это боль. Извините, спасибо за комментарий.

2. Обязательно ли использовать TextFieldParser?