Неверное имя файла или номер (vb. net) - PullRequest
0 голосов
/ 10 апреля 2020

Я не знаю, что я делаю неправильно, и мое имя файла "example1.txt" соответствует правилам, но я получаю сообщение об ошибке 52: "Неверное имя файла или номер", и я не уверен, что я делаю неправильно.

Imports System
Imports System.IO

Module Program
    Sub Main()
        Dim name() As String = {}
        Dim i As Integer = 0
        FileOpen(1, "example1.txt", OpenMode.Input)
        While Not EOF(1)
            name(i) = LineInput(i)
            Console.WriteLine(name(i))
            i += 1
        End While
        FileClose(1)
        Console.ReadLine()

    End Sub
End Module

1 Ответ

0 голосов
/ 10 апреля 2020

Специфическая проблема c заключается в том, что вы указываете номер файла 1 при открытии файла:

FileOpen(1, "example1.txt", OpenMode.Input)

, но затем вы используете другие номера файлов при чтении строк:

name(i) = LineInput(i)

Вы не говорите LineInput читать указанную строку c. Вы говорите ему прочитать следующую строку из указанного c файла. Это должно быть:

name(i) = LineInput(1)

Это пример того, почему вы не должны использовать магические числа c в вашем коде. Слишком легко их испортить. Если вы хотите использовать одно и то же значение по одной и той же причине в нескольких местах, присвойте его переменной или даже константе, а затем используйте это каждый раз:

Dim fileNumber = 1

FileOpen(fileNumber, "example1.txt", OpenMode.Input)

While Not EOF(fileNumber)
    name(i) = LineInput(fileNumber)

РЕДАКТИРОВАТЬ:

Кому достичь эквивалентной функциональности с хорошим кодом VB. NET, вы бы сделали что-то вроде этого:

Imports System.IO

Module Module1

    Sub Main()
        Dim names As New List(Of String)

        Using inputFile As New StreamReader("example1.txt")
            While Not inputFile.EndOfStream
                Dim name = inputFile.ReadLine()

                names.Add(name)
                Console.WriteLine(name)
            End While
        End Using

        Console.ReadLine()
    End Sub

End Module

или это:

Imports System.IO

Module Module1

    Sub Main()
        Dim names As New List(Of String)

        For Each name In File.ReadLines("example1.txt")
            names.Add(name)
            Console.WriteLine(name)
        Next

        Console.ReadLine()
    End Sub

End Module

или это:

Imports System.IO

Module Module1

    Sub Main()
        Dim names = File.ReadAllLines("example1.txt")

        For Each name In names
            Console.WriteLine(name)
        Next

        Console.ReadLine()
    End Sub

End Module

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

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