You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB代码从文本文件截取字符串存入数组后输出全为0,求排查

问题描述

我写的代码分为两部分:

  • 第一部分:生成3个随机变量,变量间以冒号":"分隔,写入文本文件
  • 第二部分:读取该文本文件,用Mid函数截取每行的第二个变量并存入数组

但输出数组时发现所有元素均为0,排查后仍未找到问题所在。

原代码
Dim r1, r2, r3, counter, counter1, counter2, sep As Integer
Dim line As String
Dim middleline(20)
line = ""
counter1 = 0
sep = 0
FileSystem.FileOpen(1, "C:\Users\user\OneDrive\Desktop\binarysearch.txt", OpenMode.Output, OpenAccess.Write)
For counter = 1 To 20
    If Rnd() = 0.21 Then
        r1 = -1
    Else
        Do
            r1 = Rnd() * 100
        Loop Until r1 <= 20
    End If
    Do
        r2 = Rnd() * 100
    Loop Until r2 >= 10 AndAlso r2 <= 50
    If Rnd() = 0.21 Then
        r3 = -1
    Else
        Do
            r3 = Rnd() * 100
        Loop Until r3 <= 20
    End If
    line = r1 & ":" & r2 & ":" & r3
    FileSystem.WriteLine(1, line)
Next
Console.WriteLine("Generated successfully.")

For counter = 1 To 20
    middleline(counter) = 0
Next

For counter = 1 To 20
    FileSystem.PrintLine(1, line)
    For counter1 = 1 To Len(line)
        If Mid(line, 1, counter1) = ":" Then
            sep += 1
        End If
        If sep = 1 Then
            middleline(counter2) = middleline(counter2) & Mid(line, 1, counter1)
            counter2 += counter2
        End If
    Next
Next

For counter = 1 To 20
    Console.WriteLine(middleline(counter))
Next
Console.WriteLine(middleline)
问题分析与修正

核心错误点

  1. 文件模式未切换:写完文件后没有关闭,也没有切换到读取模式,直接用同一个句柄操作,无法读取内容
  2. 读取操作错误:用FileSystem.PrintLine(1, line)是写入操作,读取应该用FileSystem.ReadLine(1)
  3. Mid函数用法错误:Mid(line, 1, counter1)是从第1位取counter1个字符,要判断单个字符应该用Mid(line, counter1, 1)
  4. 计数器逻辑错误:counter2 += counter2会让counter2始终为0,应该改为counter2 += 1;且每次处理新行时未重置sep、counter2等变量
  5. 数组索引与初始化问题:middleline数组处理时未正确拼接,且状态未重置导致混乱

修正后的代码

Dim r1, r2, r3, counter, counter1, counter2, sep As Integer
Dim line As String
Dim middleline(20) As String ' 指定数组类型为字符串,避免默认变体类型问题
line = ""
counter1 = 0
sep = 0

' 第一部分:写入文件
FileSystem.FileOpen(1, "C:\Users\user\OneDrive\Desktop\binarysearch.txt", OpenMode.Output, OpenAccess.Write)
For counter = 1 To 20
    If Rnd() = 0.21 Then
        r1 = -1
    Else
        Do
            r1 = Rnd() * 100
        Loop Until r1 <= 20
    End If
    Do
        r2 = Rnd() * 100
    Loop Until r2 >= 10 AndAlso r2 <= 50
    If Rnd() = 0.21 Then
        r3 = -1
    Else
        Do
            r3 = Rnd() * 100
        Loop Until r3 <= 20
    End If
    line = r1 & ":" & r2 & ":" & r3
    FileSystem.WriteLine(1, line)
Next
FileSystem.FileClose(1) ' 写完后关闭文件
Console.WriteLine("Generated successfully.")

' 初始化数组
For counter = 1 To 20
    middleline(counter) = "" ' 字符串数组初始化为空,而非0
Next

' 第二部分:读取文件并截取第二个变量
FileSystem.FileOpen(1, "C:\Users\user\OneDrive\Desktop\binarysearch.txt", OpenMode.Input, OpenAccess.Read)
For counter = 1 To 20
    line = FileSystem.ReadLine(1) ' 读取每行内容
    sep = 0
    Dim tempStr As String = "" ' 临时存储第二个变量
    For counter1 = 1 To Len(line)
        Dim currentChar As String = Mid(line, counter1, 1) ' 取当前单个字符
        If currentChar = ":" Then
            sep += 1
        Else
            If sep = 1 Then ' 处于第二个变量的区间
                tempStr &= currentChar
            End If
        End If
    Next
    middleline(counter) = tempStr ' 将截取的第二个变量存入数组
Next
FileSystem.FileClose(1) ' 读完后关闭文件

' 输出数组内容
For counter = 1 To 20
    Console.WriteLine(middleline(counter))
Next

修正说明

  • 写完文件后调用FileSystem.FileClose(1)关闭文件,再以读取模式重新打开
  • 读取每行用FileSystem.ReadLine(1)获取正确内容
  • 用Mid(line, counter1, 1)逐个读取字符,判断是否为分隔符,截取第二个变量的内容
  • 每次处理新行时重置sep、tempStr等变量,避免状态污染
  • 将middleline数组指定为字符串类型,初始化为空字符串,确保拼接正确

内容的提问来源于stack exchange,提问作者Borkode

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 01:22:10