标题: 一个VB的问题
性别:未知-离线 陈珺

Rank: 6Rank: 6Rank: 6
组别 校尉
级别 军师将军
好贴 5
功绩 26
帖子 927
编号 3820
注册 2003-12-27
来自 福建福州


发表于 2005-2-3 21:06 资料 个人空间 短消息 只看该作者
最近在做游戏的数据库,做着做着遇到了一个问题.
open "c:\aa.dbc" For Binary As #1
put #1,1,"aa"
put #1,5,"bb"
put #1,9,"cc"
close #1
这时侯文件里面大致是这样
aa  bb  cc
这时侯我想把aa  bb之后的全部去掉,代码该怎么写(文件大小相应减小)


顶部
性别:未知-离线 Maxwell

代王
监管使
枢密直学士
山南西道节度使

Rank: 27Rank: 27Rank: 27Rank: 27Rank: 27Rank: 27
柱国(正二品)
组别 诸侯
级别 征东将军
好贴 4
功绩 1845
帖子 5800
编号 622
注册 2004-7-7


发表于 2005-2-3 21:15 资料 文集 短消息 只看该作者
我基本不用vb操作文件,也没记得vb有截断文件的语句。要么你用api操作,要么就每次重新完全写文件。我一般操作文件都是每次重新写一个新文件。


顶部
性别:未知-离线 陈珺

Rank: 6Rank: 6Rank: 6
组别 校尉
级别 军师将军
好贴 5
功绩 26
帖子 927
编号 3820
注册 2003-12-27
来自 福建福州


发表于 2005-2-3 21:22 资料 个人空间 短消息 只看该作者


QUOTE:
原帖由Maxwell于2005-02-03, 21:15:49发表
我基本不用vb操作文件,也没记得vb有截断文件的语句。要么你用api操作,要么就每次重新完全写文件。我一般操作文件都是每次重新写一个新文件。

以往的做法是重新一个新文件,然后把这个文件删掉.我现在是想寻求更好的办法.
顶部
性别:未知-离线 Maxwell

代王
监管使
枢密直学士
山南西道节度使

Rank: 27Rank: 27Rank: 27Rank: 27Rank: 27Rank: 27
柱国(正二品)
组别 诸侯
级别 征东将军
好贴 4
功绩 1845
帖子 5800
编号 622
注册 2004-7-7


发表于 2005-2-3 21:31 资料 文集 短消息 只看该作者
直接以写方式打开原来的文件重新写入即可,根本不必写到新文件里再把旧的删掉。重新写文件通常是因为文件内容改变的太多致使修改文件不合算。如果只是删除最后的字节用api就可以简单解决!
顶部
性别:未知-离线 陈珺

Rank: 6Rank: 6Rank: 6
组别 校尉
级别 军师将军
好贴 5
功绩 26
帖子 927
编号 3820
注册 2003-12-27
来自 福建福州


发表于 2005-2-3 21:51 资料 个人空间 短消息 只看该作者


QUOTE:
原帖由Maxwell于2005-02-03, 21:31:56发表
直接以写方式打开原来的文件重新写入即可,根本不必写到新文件里再把旧的删掉。重新写文件通常是因为文件内容改变的太多致使修改文件不合算。如果只是删除最后的字节用api就可以简单解决!

具体是调用哪个呢
顶部
性别:未知-离线 Maxwell

代王
监管使
枢密直学士
山南西道节度使

Rank: 27Rank: 27Rank: 27Rank: 27Rank: 27Rank: 27
柱国(正二品)
组别 诸侯
级别 征东将军
好贴 4
功绩 1845
帖子 5800
编号 622
注册 2004-7-7


发表于 2005-2-3 22:11 资料 文集 短消息 只看该作者
SetEndOfFile

VB声明
Declare Function SetEndOfFile Lib "kernel32" Alias "SetEndOfFile" (ByVal hFile As Long) As Long
说明
针对一个打开的文件,将当前文件位置设为文件末尾
返回值
Long,非零表示成功,零表示失败。会设置GetLastError
参数表
参数 类型及说明
hFile Long,指定一个文件句柄。文件的当前位置设为文件尾,文件会根据需要缩短


了解windows api是做windows程序的基本功。
顶部
性别:未知-离线 陈珺

Rank: 6Rank: 6Rank: 6
组别 校尉
级别 军师将军
好贴 5
功绩 26
帖子 927
编号 3820
注册 2003-12-27
来自 福建福州


发表于 2005-2-3 22:18 资料 个人空间 短消息 只看该作者


QUOTE:
原帖由Maxwell于2005-02-03, 22:11:08发表
SetEndOfFile

VB声明
Declare Function SetEndOfFile Lib "kernel32" Alias "SetEndOfFile" (ByVal hFile As Long) As Long
说明
针对一个打开的文件,将当前文件位置设为文件末尾
返回值
Long,非零表示成功,零表示失败。会设置GetLastError
参数表
参数 类型及说明
hFile Long,指定一个文件句柄。文件的当前位置设为文件尾,文件会根据需要缩短


了解windows api是做windows程序的基本功。

说说看,怎么用API 文本浏览器找到所想要的东西?好像里面没法用中文搜索内容.
顶部
性别:未知-离线 Maxwell

代王
监管使
枢密直学士
山南西道节度使

Rank: 27Rank: 27Rank: 27Rank: 27Rank: 27Rank: 27
柱国(正二品)
组别 诸侯
级别 征东将军
好贴 4
功绩 1845
帖子 5800
编号 622
注册 2004-7-7


发表于 2005-2-3 22:25 资料 文集 短消息 只看该作者
api浏览器是用来查找api定义的,不是用来看api的用途的。要是英文的api手册看不懂就到网上找找中文的api手册,有for vb的。
顶部
性别:未知-离线 timw

Rank: 1
组别 百姓
级别 在野武将
功绩 0
帖子 15
编号 31643
注册 2005-2-1


发表于 2005-2-4 12:41 资料 短消息 只看该作者
VB玩得不熟。
顶部
性别:未知-离线 金圭子

白衣伯爵中大夫

Rank: 14Rank: 14Rank: 14Rank: 14Rank: 14
组别 白衣卿相
级别 征西将军
好贴 4
功绩 265
帖子 4926
编号 27961
注册 2004-12-16


发表于 2005-2-4 12:49 资料 文集 短消息 只看该作者
刚刚牺牲了午饭查了查资料,写了一段,
command2用来新建文件,command1用来截断文件

Option Explicit

Private Const OFS_MAXPATHNAME = 128
Private Type OFSTRUCT
        cBytes As Byte
        fFixedDisk As Byte
        nErrCode As Integer
        Reserved1 As Integer
        Reserved2 As Integer
        szPathName(OFS_MAXPATHNAME) As Byte
End Type

Private Const OF_READWRITE = &H2
Private Const OF_SHARE_COMPAT = &H0
Private Const OF_SHARE_DENY_NONE = &H40

Private Declare Function OpenFile Lib "kernel32" (ByVal lpFileName As String, lpReOpenBuff As OFSTRUCT, ByVal wStyle As Long) As Long

Private Declare Function SetEndOfFile Lib "kernel32" (ByVal hFile As Long) As Long

Private Const FILE_BEGIN = 0
Private Declare Function SetFilePointer Lib "kernel32" (ByVal hFile As Long, ByVal lDistanceToMove As Long, lpDistanceToMoveHigh As Long, ByVal dwMoveMethod As Long) As Long

Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

Private Declare Function GetLastError Lib "kernel32" () As Long


Private Sub Command1_Click()
Dim fHandle As Long
Dim ofs As OFSTRUCT
fHandle = OpenFile("c:\aa.dbc", ofs, OF_READWRITE Or OF_SHARE_DENY_NONE)
If fHandle = -1 Then
    MsgBox "OpenError=" & ofs.nErrCode
Else
  If SetFilePointer(fHandle, 3, 0, FILE_BEGIN) = -1 Then
    MsgBox "SetPointError=" & GetLastError
  Else
    If SetEndOfFile(fHandle) = 0 Then MsgBox "LastError=" & GetLastError Else MsgBox "Ok"
  End If
  Call CloseHandle(fHandle)
End If
End Sub

Private Sub Command2_Click()
Open "c:\aa.dbc" For Binary As #1
Put #1, 1, "aa"
Put #1, 5, "bb"
Put #1, 9, "cc"
Close #1
End Sub
顶部
性别:未知-离线 Maxwell

代王
监管使
枢密直学士
山南西道节度使

Rank: 27Rank: 27Rank: 27Rank: 27Rank: 27Rank: 27
柱国(正二品)
组别 诸侯
级别 征东将军
好贴 4
功绩 1845
帖子 5800
编号 622
注册 2004-7-7


发表于 2005-2-4 12:51 资料 文集 短消息 只看该作者
金圭子强,连代码都写出来了。
顶部
性别:未知-离线 金圭子

白衣伯爵中大夫

Rank: 14Rank: 14Rank: 14Rank: 14Rank: 14
组别 白衣卿相
级别 征西将军
好贴 4
功绩 265
帖子 4926
编号 27961
注册 2004-12-16


发表于 2005-2-4 12:53 资料 文集 短消息 只看该作者


QUOTE:
原帖由Maxwell于2005-02-04, 12:51:47发表
    金圭子强,连代码都写出来了。

我想吃午饭
顶部
性别:未知-离线 timw

Rank: 1
组别 百姓
级别 在野武将
功绩 0
帖子 15
编号 31643
注册 2005-2-1


发表于 2005-2-4 12:56 资料 短消息 只看该作者
帅~!
顶部
性别:未知-离线 陈珺

Rank: 6Rank: 6Rank: 6
组别 校尉
级别 军师将军
好贴 5
功绩 26
帖子 927
编号 3820
注册 2003-12-27
来自 福建福州


发表于 2005-2-4 14:14 资料 个人空间 短消息 只看该作者
太谢谢了,我要继续做战略三国数据库了,我如果还有问题会在这回贴问的
顶部
性别:未知-离线 陈珺

Rank: 6Rank: 6Rank: 6
组别 校尉
级别 军师将军
好贴 5
功绩 26
帖子 927
编号 3820
注册 2003-12-27
来自 福建福州


发表于 2005-2-7 20:44 资料 个人空间 短消息 只看该作者
问题二:假设abc.abc中是如下这样
abcdefgh
dim i as string *1
open "c:\abc.abc" For Binary As #1
get #1,1,i
close #1
如上代码,那么i会得到a
我如果要做成
Fgetfield(文件名,字段长度)这样的函数,以往的做法是
function Fgetfield(filename,fieldlen)
dim i1 as string *1
dim i2 as string *2
dim i3 as string *3
dim i4 as string *4
dim i5 as string *5
dim i6 as string *6
open filename For Binary As #1
select case fieldlen
case 1
get #1,1,i1
Fgetfield=i1
case 2
get #1,1,i2
Fgetfield=i2
case 3
get #1,1,i3
Fgetfield=i3
case 4
get #1,1,i4
Fgetfield=i4
case 5
get #1,1,i5
Fgetfield=i5
case 6
get #1,1,i6
Fgetfield=i6
end select
close #1
end function
这样如果最大只需要截取字符长度为6的字段,尚且可以,但如果要截取字符长度为n的字段(n是一个足够大的数,假设文件的字节数比n大),那应该怎么做?
顶部
性别:未知-离线 Tom Joad

Rank: 4
组别 校尉
级别 破贼校尉
功绩 16
帖子 93
编号 6524
注册 2004-4-5


发表于 2005-2-7 23:52 资料 文集 短消息 只看该作者
redim一个数组可以么?
顶部
性别:未知-离线 陈珺

Rank: 6Rank: 6Rank: 6
组别 校尉
级别 军师将军
好贴 5
功绩 26
帖子 927
编号 3820
注册 2003-12-27
来自 福建福州


发表于 2005-2-8 11:43 资料 个人空间 短消息 只看该作者


QUOTE:
原帖由Tom Joad于2005-02-07, 23:52:53发表
redim一个数组可以么?

能具体举个例子吗?
顶部
性别:未知-离线 心心的哼哼

Rank: 2Rank: 2
组别 百姓
级别 破贼校尉
功绩 1
帖子 67
编号 32193
注册 2005-2-7


发表于 2005-2-8 12:37 资料 短消息 只看该作者
这个问题搞不定啊,楼主还是找别人吧..
顶部
性别:未知-离线 陈珺

Rank: 6Rank: 6Rank: 6
组别 校尉
级别 军师将军
好贴 5
功绩 26
帖子 927
编号 3820
注册 2003-12-27
来自 福建福州


发表于 2005-2-8 23:35 资料 个人空间 短消息 只看该作者
经过一个晚上的四处询问,问题终于解决了
function Fgetfield(filename,fieldlen)
open filename For Binary As #1
dim a as string
a=string(fieldlen,0)
get #1,a
close
Fgetfield=a
end function
顶部

正在浏览此帖的会员 - 共 1 人在线




当前时区 GMT+8, 现在时间是 2025-2-5 16:54
京ICP备2023018092号 轩辕春秋 2003-2023 www.xycq.org.cn

Powered by Discuz! 5.0.0 2001-2006 Comsenz Inc.
Processed in 0.014205 second(s), 9 queries , Gzip enabled

清除 Cookies - 联系我们 - 轩辕春秋 - Archiver - WAP