Vb.net Visual Basic.NET-添加两个数字(来自文件的I/O)
下面的代码应该将文件“input.txt”中的两个数字相加,并将总和写入“output.txt”。编译成功,但运行程序后“output.txt”仍然为空。我做错了什么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
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”),并且您具有读取和写入这些文件所需的操作系统权限,那么它也应该对您起作用。但是,值得一提的是,您的代码有几个问题