Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net Visual Basic.NET-添加两个数字(来自文件的I/O)_Vb.net - Fatal编程技术网

Vb.net Visual Basic.NET-添加两个数字(来自文件的I/O)

Vb.net Visual Basic.NET-添加两个数字(来自文件的I/O),vb.net,Vb.net,下面的代码应该将文件“input.txt”中的两个数字相加,并将总和写入“output.txt”。编译成功,但运行程序后“output.txt”仍然为空。我做错了什么 Imports System.IO Public Class test Public Shared Sub Main() Dim scan as StreamReader = new StreamReader("input.txt") Dim writer as StreamW

下面的代码应该将文件“input.txt”中的两个数字相加,并将总和写入“output.txt”。编译成功,但运行程序后“output.txt”仍然为空。我做错了什么

   Imports System.IO
    Public Class test
    Public Shared Sub Main()
        Dim scan as StreamReader = new StreamReader("input.txt")
        Dim writer as StreamWriter = new StreamWriter("output.txt", True)
        Dim input as String
        input = scan.ReadLine()
        Dim ab() as String = Split(input)
        Dim res as Integer = Val(ab(0))+Val(ab(1))
        writer.writeLine(res)
        writer.close()
    End sub
    End class

您的代码对我来说运行正常,因此只要您的输入文件格式正确(即一行两个数字之间用空格分隔,如“1 2”),并且您具有读取和写入这些文件所需的操作系统权限,那么它也应该对您起作用。但是,值得一提的是,您的代码中有几个问题需要纠正,因为这与典型的最佳实践背道而驰

首先,您应该尽可能地启用
选项Strict
。我知道你把它关闭了,因为你的代码不能用它编译。以下行在技术上具有误导性,因此在对
选项进行严格限制时失败:

 Dim res As Integer = Val(ab(0)) + Val(ab(1))
if失败的原因是因为
Val
函数返回的是一个
Double
,而不是一个整数,因此,从技术上讲,根据文件的内容,结果可能是分数,或者可能太大而无法放入
整数中。使用
选项Strict Off
,编译器基本上会自动为您修复代码,如下所示:

Dim res As Integer = CInt(Val(ab(0)) + Val(ab(1)))
Using scan As StreamReader = New StreamReader("test.txt")
    Using writer As StreamWriter = New StreamWriter("output.txt", True)
        Dim input As String
        input = scan.ReadLine()
        Dim ab() As String = Split(input)
        Dim res As Integer = Integer.Parse(ab(0)) + Integer.Parse(ab(1))
        writer.WriteLine(res)
    End Using
End Using
为了将
res
变量设置为等于计算结果,必须将功能更强的
Double
值转换为
整数。当您被迫自己将
CInt
放入代码中时,您完全知道转换正在进行,并且可能会产生什么后果。当您使用
选项Strict Off
并在后台插入转换时,您很可能会错过一个潜在的bug

其次,
Val
函数是老式的VB6语法。虽然它在技术上运行良好,但它主要是为了向后兼容而提供的。新的.NET等价物将使用
Integer.Parse
Integer.TryParse
Convert.ToInt32

第三,永远不要关闭
扫描
流读取器。您可以只在方法末尾添加
scan.Close()
,但如果可能,最好为任何一次性对象使用
块创建
,如下所示:

Dim res As Integer = CInt(Val(ab(0)) + Val(ab(1)))
Using scan As StreamReader = New StreamReader("test.txt")
    Using writer As StreamWriter = New StreamWriter("output.txt", True)
        Dim input As String
        input = scan.ReadLine()
        Dim ab() As String = Split(input)
        Dim res As Integer = Integer.Parse(ab(0)) + Integer.Parse(ab(1))
        writer.WriteLine(res)
    End Using
End Using
最后,正如Hans指出的,依赖当前目录是不好的。最好为文件指定完整路径。框架中有不同的方法来获取各种文件夹路径,例如用户的桌面文件夹、下载文件夹、临时文件夹、应用程序文件夹、当前应用程序的文件夹或当前正在运行的程序集的文件夹。您可以使用任何此类方法获取所需的文件夹路径,然后使用
path.Combine
添加文件名以获取完整的文件路径。例如:

Dim desktopFolderPath As String = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)
Dim inputFilePath As String = Path.Combine(desktopFolderPath, "input.txt")
Dim outputFilePath As String = Path.Combine(desktopFolderPath, "output.txt")

您的代码对我来说运行正常,因此只要您的输入文件格式正确(即一行两个数字之间用空格分隔,如“1 2”),并且您具有读取和写入这些文件所需的操作系统权限,那么它也应该对您起作用。但是,值得一提的是,您的代码中有几个问题需要纠正,因为这与典型的最佳实践背道而驰

首先,您应该尽可能地启用
选项Strict
。我知道你把它关闭了,因为你的代码不能用它编译。以下行在技术上具有误导性,因此在对
选项进行严格限制时失败:

 Dim res As Integer = Val(ab(0)) + Val(ab(1))
if失败的原因是因为
Val
函数返回的是一个
Double
,而不是一个整数,因此,从技术上讲,根据文件的内容,结果可能是分数,或者可能太大而无法放入
整数中。使用
选项Strict Off
,编译器基本上会自动为您修复代码,如下所示:

Dim res As Integer = CInt(Val(ab(0)) + Val(ab(1)))
Using scan As StreamReader = New StreamReader("test.txt")
    Using writer As StreamWriter = New StreamWriter("output.txt", True)
        Dim input As String
        input = scan.ReadLine()
        Dim ab() As String = Split(input)
        Dim res As Integer = Integer.Parse(ab(0)) + Integer.Parse(ab(1))
        writer.WriteLine(res)
    End Using
End Using
为了将
res
变量设置为等于计算结果,必须将功能更强的
Double
值转换为
整数。当您被迫自己将
CInt
放入代码中时,您完全知道转换正在进行,并且可能会产生什么后果。当您使用
选项Strict Off
并在后台插入转换时,您很可能会错过一个潜在的bug

其次,
Val
函数是老式的VB6语法。虽然它在技术上运行良好,但它主要是为了向后兼容而提供的。新的.NET等价物将使用
Integer.Parse
Integer.TryParse
Convert.ToInt32

第三,永远不要关闭
扫描
流读取器。您可以只在方法末尾添加
scan.Close()
,但如果可能,最好为任何一次性对象使用
块创建
,如下所示:

Dim res As Integer = CInt(Val(ab(0)) + Val(ab(1)))
Using scan As StreamReader = New StreamReader("test.txt")
    Using writer As StreamWriter = New StreamWriter("output.txt", True)
        Dim input As String
        input = scan.ReadLine()
        Dim ab() As String = Split(input)
        Dim res As Integer = Integer.Parse(ab(0)) + Integer.Parse(ab(1))
        writer.WriteLine(res)
    End Using
End Using
最后,正如Hans指出的,依赖当前目录是不好的。最好为文件指定完整路径。框架中有不同的方法来获取各种文件夹路径,例如用户的桌面文件夹、下载文件夹、临时文件夹、应用程序文件夹、当前应用程序的文件夹或当前正在运行的程序集的文件夹。您可以使用任何此类方法获取所需的文件夹路径,然后使用
path.Combine
添加文件名以获取完整的文件路径。例如:

Dim desktopFolderPath As String = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)
Dim inputFilePath As String = Path.Combine(desktopFolderPath, "input.txt")
Dim outputFilePath As String = Path.Combine(desktopFolderPath, "output.txt")

您的代码对我来说运行正常,因此只要您的输入文件格式正确(即一行两个数字之间用空格分隔,如“1 2”),并且您具有读取和写入这些文件所需的操作系统权限,那么它也应该对您起作用。但是,值得一提的是,您的代码有几个问题