您的位置:程序门 -> vb -> 基础类



续vb实现矩阵运算之读取文件


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


续vb实现矩阵运算之读取文件
发表于:2007-08-02 16:39:49 楼主
从txt文件从某行开始读,将数据赋值给一个数组
还是下标越界啊
private   sub   command1_click()
    dim   filet()   as   byte,   filelen   as   long,   strt()   as   string,   i   as   long
    dim   b(2)   as   string
    dim   data()   as   string,   a()   as   long
    dim   n   as   long
    open   "e:\3.txt "   for   binary   as   #1
    filelen   =   lof(1)
    redim   filet(filelen   -   1)
    get   #1,   ,   filet
    filet   =   strconv(filet,   vbunicode)
    strt   =   split(filet,   vbcrlf)
    '然后假如说你从第7行开始取值给b
    n   =   0
    for   x   =   6   to   ubound(strt)
        b(x   -   6)   =   strt(x)
        'debug.print   b(x   -   6)
        data   =   split(b(x   -   6),   " ")
          redim   a(ubound(data))
        for   i   =   0   to   ubound(data)
          a(n)   =   val(data(i))-------错误行
          n   =   n   +   1
          print   a(i)
        next   i
    next
end   sub

我的data肯定是有数据的啊
print   data(i)都没有问题
发表于:2007-08-02 16:55:131楼 得分:0
如果print   data(i)都没有问题,哪真是奇怪了!
我看,应该有问题的是b(x   -   6)   =   strt(x),因为dim   b(2)   as   string,只要ubound(data)>8,就下标越界!
你在data   =   split(b(x   -   6),   " ")
后面加上:debug.print   ubound(data),看看打印出来的是什么?
发表于:2007-08-02 16:58:152楼 得分:0
0
0
发表于:2007-08-02 17:01:473楼 得分:0
debug.print   ubound(data)
for   i   =   0   to   ubound(data)
a(n)   =   val(data(i))-------错误行
n   =   n   +   1
print   a(i)
next   i
next
end   sub

你加断点自己看看就好了
发表于:2007-08-02 17:15:394楼 得分:0
刚才修改位置搞错了   试试这样改
private   sub   form_load()
    n   =   0
    for   x   =   6   to   ubound(strt)
        b(x   -   6)   =   strt(x)
        'debug.print   b(x   -   6)
        data   =   split(b(x   -   6))
        for   i   =   0   to   ubound(data)
            if   x   =   6   then
                redim   a(ubound(data))
            else
                redim   preserve   a(ubound(data)   +   ubound(a)   +   1)
            end   if
            a(n)   =   val(data(i))   -   ------错误行
            n   =   n   +   1
            print   a(i)
        next   i
    next
end   sub
发表于:2007-08-02 17:16:085楼 得分:0
print   a(i)   要改成   print   a(n)
发表于:2007-08-02 18:08:516楼 得分:0
这样改了之后还是a(n)   =   val(data(i))   下标越界
结果全是0
发表于:2007-08-02 18:31:037楼 得分:0
private   sub   form_load()
n   =   0
for   x   =   6   to   ubound(strt)
b(x   -   6)   =   strt(x)
'debug.print   b(x   -   6)
redim   data(0   to   0)
data   =   split(b(x   -   6))     '我觉得你需要跟踪的是每一次的data数组的变化,ubound多少,或者添加上我刚刚的那句
if   x   =   6   then
redim   a(ubound(data))
else
redim   preserve   a(ubound(data)   +   ubound(a)   +   1)
end   if
‘把拓展数组放在小循环外面
for   i   =   0   to   ubound(data)
a(n)   =   val(data(i))   -   ------错误行
n   =   n   +   1
print   a(n)
next   i
next
end   sub

发表于:2007-08-02 18:50:418楼 得分:0
print   a(n)下标越界,结果全是0
我是把把拓展数组放在小循环外面啊
你刚刚说的要添加的那句是哪句啊
发表于:2007-08-02 20:13:459楼 得分:0
这2句顺序错了
print   a(n)
n   =   n   +   1
发表于:2007-08-02 20:14:3410楼 得分:0
n   =   0
    for   x   =   6   to   ubound(strt)
        b(x   -   6)   =   strt(x)
        'debug.print   b(x   -   6)
        data   =   split(b(x   -   6))
            if   x   =   6   then
                redim   a(ubound(data))
            else
                redim   preserve   a(ubound(data)   +   ubound(a)   +   1)
            end   if
        for   i   =   0   to   ubound(data)
            a(n)   =   val(data(i))   -   ------错误行
            print   a(n)
            n   =   n   +   1
        next   i
    next
发表于:2007-08-02 20:34:3411楼 得分:0
private   sub   command1_click()
dim   filet()   as   byte,   filelen   as   long,   strt()   as   string,   i   as   long
dim   b(2)   as   string
dim   data()   as   string,   a()   as   long
dim   n   as   long
open   "c:\3.txt "   for   binary   as   #1
filelen   =   lof(1)
redim   filet(filelen   -   1)
get   #1,   ,   filet
filet   =   strconv(filet,   vbunicode)
strt   =   split(filet,   vbcrlf)
'????????7??????b
n   =   0
for   x   =   6   to   ubound(strt)
b(x   -   6)   =   strt(x)
'debug.print   b(x   -   6)
data   =   split(b(x   -   6))
if   x   =   6   then
redim   a(ubound(data))
else
redim   preserve   a(ubound(data)   +   ubound(a)   +   1)
end   if
for   i   =   0   to   ubound(data)
a(n)   =   val(data(i))   '-   ------???
debug.print   a(n)
n   =   n   +   1
next   i
next

end   sub

这个代码我调试通过了,你拷贝过去试试看

发表于:2007-08-02 20:49:3812楼 得分:0
现在没有刚才那个错误了
但是结果有点问题
例如我的第7行开始的数据是这样的
4   -3   0   1       第7行
  -2   4   -1           第8行
5   2   -4   5   1           第9行
4   -3     -15       4   5         第10行
输出的结果是
4   -3   0   1   0   -2   4   -1   0   5   2   -4   5   1   0   4   -3     -15   0   0   4   5   0
每行后面都会多个0值
而且一个数据要是在两行的话就成了两个数据了。例如-15,就成了-1,5
两个空格的话就会输出两个0
这该怎么处理啊


发表于:2007-08-02 21:34:0613楼 得分:0
clear   zero你的程序不行啊,调试通不过
redim   filet(filelen   -   1)     下标越界
发表于:2007-08-02 21:46:4814楼 得分:0
我刚刚的代码我这里是通的
你可能用了一个空白文件试验我的代码

你每行后面的0是因为你换行前的行尾有个一空格
4   -3   0   1   空格
-2....
解决方法b(x   -   6)   =   rtrim(strt(x))

一个数据分两行的话,那就只能是逻辑方面了。不然程序如何知道-15而不是-1   5呢
发表于:2007-08-02 21:47:5115楼 得分:0
小小修改下
n   =   0
    for   x   =   6   to   ubound(strt)
        b(x   -   6)   =   strt(x)
        'debug.print   b(x   -   6)
        data   =   split(b(x   -   6))
            if   x   =   6   then
                redim   a(ubound(data))
            else
                redim   preserve   a(ubound(data)   +   ubound(a)   +   1)
            end   if
        for   i   =   0   to   ubound(data)
          if   data(i) <> " "   then
            a(n)   =   val(data(i))
            print   a(n)
            n   =   n   +   1
          end   if
        next   i
    next
发表于:2007-08-02 21:55:0616楼 得分:0
data   =   split(b(x   -   6))
改为
data   =   trim(split(b(x   -   6)))
发表于:2007-08-03 15:50:5717楼 得分:0
现在可以了
就是一个数据分两行的话确实不好解决。
发表于:2007-08-03 16:14:5618楼 得分:0
是这样的,有个txt文件里面只有1,2,4,8,16,32,64,128,-9999,0这些数据(0只有一个),如果可以判断行尾那个数据就可以吧,如果是1的话就看下一个数据,是6的话肯定就是16,是28的话就是128,其他就是1,
行尾那个数是3的话那个数肯定就是32,6的话就是64,12的话就是128,跳过后面那个数就是。
不过我不知道行尾怎么判断。

另外那个文件就有点不好处理了。
不过就算一个数据分两行该数据还是连在一起的啊,中间没有空格。
往行尾那个数前多加几个空格它就到下行去了,而且数据是连在一起的。
就是比如说-12.345在一行,78在下一行。把-12.345移下一行数据就没有分开了。
数据分开的话一般都是因为txt文件的该行已经写满了,没写满的话数据还是没有分开的。
发表于:2007-08-03 16:54:3619楼 得分:0
没有空格但是有回车
发表于:2007-08-03 17:10:3420楼 得分:0
open   "e:\3.txt "   for   input   as   #2          
          for   i   =   0   to   ubound(b())
    input   #2,   temp
b(i)   =   val(temp)
next   i
close   #2
这样读没有问题,不过我不知道这样读的话怎么从某行开始读
你之前给我代码是整行读取的
我这个是数据块读取
发表于:2007-08-04 09:26:5621楼 得分:0
文本文件如果比较小,可以一次读取:

private   sub   command1_click()
dim   s()   as   string,   i   as   long,   b(1   to   10)   as   string
open   "e:\3.txt "   for   input   as   #2
s   =   split(strconv(inputb(lof(2),   2),   vbunicode),   vbcrlf)
close   #2
for   i   =   1   to   10
b(i)   =   trim(s(i   +   5))   '   从第7行开始读
next   i
msgbox   join(b,   vbcrlf)
end   sub
发表于:2007-08-04 10:31:3722楼 得分:0
一个23兆多,一个56兆多,这已经算大的了吧。
发表于:2007-08-05 07:09:1923楼 得分:0
mark!
发表于:2007-08-05 20:46:2024楼 得分:0
小刀惋心,你的这段代码有点不明白。能说说你的思路吗?
我的数组太大,超出了一维数组的范围,想改为二维的实现
for   i   =   0   to   bc
        t   =   a(i)
        if   t   >   0   and   (c(i)   <>   -9999)   then
            t   =   2   ^   (t   -   1)
            bsp(i   +   a_b(a(i)))   =   bsp(i   +   a_b(a(i)))   or   t     '累计儿子结点状况   最多8个   即当bsp(i)=255   或者   11111111(二进制)
        end   if
    next   i
   
    '开始正式转换
    do
        stoploop   =   true
        for   i   =   0   to   bc
            if   not   bcd(i)   and   (c(i)   <>   -9999)   then   '判断是否计算过
            if   bsp(i)   =   0   then   '判断结点是否是原始结点,没有儿子节点
            if   c(i)   <   0   then   c(i)   =   0   '处理小于0的
                if   a(i)   =   -9999   then   c(i)   =   -9999         '两个矩阵中只要有一个为-9999,则结果为-9999,
                      '如果希望结果仍然是b矩阵的值,可以不要这行代码
                      bcd(i)   =   true                     '表明该源汇值没有计算过
                      t   =   a(i)
                          if   t   >   0   then
                              t   =   2   ^   (t   -   1)
                              c(i   +   a_b(a(i)))   =   c(i   +   a_b(a(i)))   +   c(i)
                              bsp(i   +   a_b(a(i)))   =   bsp(i   +   a_b(a(i)))   xor   t           '异或
                              stoploop   =   false
                        end   if
                end   if
            end   if
        next   i
        print
    loop   until   stoploop
发表于:2007-08-05 20:58:4725楼 得分:0
多少维   都一样的   能够包含的元素不会增加的
发表于:2007-08-06 10:46:5126楼 得分:0
二维的话肯定要比一维的存储大一些吧
发表于:2007-08-06 11:17:3827楼 得分:0
和内存大小有关   多少维都一样的
发表于:2007-08-06 14:26:1028楼 得分:0
2200列3326行读取的时候二维的可以,
一维的就不行啊,
说明二维应该存储大一些啊。
你那个程序能改成二维的吗?
发表于:2007-08-08 15:10:2229楼 得分:0
怎么没有响应啊。
小刀惋心帮帮啊,看你的程序能不能改成二维的。
不行的话那我就另外找思路好了。


快速检索

最新资讯
热门点击