注册 登录
编程论坛 VB6论坛

这是从 txt 中读取二维数组,但是老报错:下标越界, 求大神解救!!!谢谢!我的二维数组大概有 50*6 左右

yangfang577 发布于 2014-06-16 22:00, 596 次点击
Private Sub Command1_Click()
Dim str1() As String
Dim str2() As String
Dim arr() As String
Dim rows As Integer
Dim cols As Integer
Dim i As Integer
Dim j As Integer
Open "c:\in.txt" For Input As #1
rows = 0
Do Until EOF(1)
rows = rows + 1
ReDim Preserve str1(rows) As String
Line Input #1, str1(rows)
cols = UBound(Split(str1(rows), ","))
Loop
Close #1
ReDim arr(rows, cols) As String
For i = 1 To rows
str2 = Split(str1(i), ",")
For j = 0 To cols
arr(i, j) = str2(j)
Print "arr(" & i & "," & j & ")=" & arr(i, j),
Next
Print
Next
End Sub
9 回复
#2
xzlxzlxzl2014-06-17 09:36
根据你的题意自创了个in.txt文件,40组数据,未发现报错,检查下你的in.txt文件,或提供你的in.txt文件调试下就知道了。
#3
yangfang5772014-06-19 10:40
回复 2 楼 xzlxzlxzl
1,1,0,0,2,0,3,3,
2,3,0,0,5,3,3,3,
这就是in.txt内容  谢谢
#4
xzlxzlxzl2014-06-19 11:04
真不好意思,还是没有发现错误,见下图:
只有本站会员才能查看附件,请 登录
#5
bczgvip2014-06-19 22:33
【,】
【,】
#6
yangfang5772014-06-20 11:42
想哭,这是我的运行结果,我电脑是 win7 系统,txt 是 07 版本
只有本站会员才能查看附件,请 登录
#7
风吹过b2014-06-21 11:57
仔细看了你们的代码。
代码的流程无问题,问题出在数据文件上,存在空行,而代码里没有容错处理,导致下标越界。


Private Sub Command1_Click()
Dim str1() As String
Dim str2() As String
Dim arr() As String
Dim rows As Integer
Dim cols As Integer
Dim cols2 As Integer              '增加一个变量
Dim i As Integer
Dim j As Integer
Open "C:\in.txt" For Input As #1
rows = 1
Do Until EOF(1)
'rows = rows + 1              '移到后面处理
ReDim Preserve str1(rows) As String
Line Input #1, str1(rows)
cols = UBound(Split(str1(rows), ","))          '找每次的下标
If cols2 < cols Then cols2 = cols              '保存最大的下标
If Len(str1(rows)) > 0 Then rows = rows + 1    '因为存在空行,所以空行不计数,直接跳。如果数据的最后有空行,会导致最后多一个空行。

Loop
Close #1
ReDim arr(rows, cols2) As String               '按最大下标生成数组,前面的代码,如果空行在最后,那么这里报错。
For i = 1 To rows
str2 = Split(str1(i), ",")
For j = 0 To UBound(str2)                      '按当前下标复制数据。前面的代码,如果空行在中间,那么这里报错。
arr(i, j) = str2(j)
Print "arr(" & i & "," & j & ")=" & arr(i, j),
Next
Print
Next
End Sub
#8
xzlxzlxzl2014-06-23 05:57
好吧,的确应该像7楼版主那样考虑下极端情况,要有一定的容错能力。不过应该是使用最小的cols,如果像7楼那样使用最大的cols的话,对少于cols的行split就会产生下标越界的错误,修改后的代码如下:
Private Sub Command1_Click()
Dim str1() As String
Dim str2() As String
Dim arr() As String
Dim rows As Integer
Dim cols As Integer
Dim i As Integer
Dim j As Integer
Open "c:\in.txt" For Input As #1
rows = 0
Do Until EOF(1)
rows = rows + 1
ReDim Preserve str1(rows) As String
Line Input #1, str1(rows)
i = UBound(Split(str1(rows), ","))
If cols > i Or cols <= 0 Then cols = i
Loop
Close #1
ReDim arr(rows, cols) As String
For i = 1 To rows
If str1(i) <> "" Then
str2 = Split(str1(i), ",")
For j = 0 To cols
arr(i, j) = str2(j)
Print "arr(" & i & "," & j & ")=" & arr(i, j),
Next
Print
End If
Next
End Sub
#9
yangfang5772014-06-27 11:48
回复 2 楼 xzlxzlxzl
只有本站会员才能查看附件,请 登录

这是我的in 文件 但是我怎么弄都不对 我觉得是这个TXT文件的原因 但是找不出来  
#10
风吹过b2014-06-27 15:04
回复 9 楼 yangfang577
没看懂什么意思。

你提供的附件里的文件,正常的很,没任意问题啊。
1