vb能不能一次性把文本文件的内容读到一个string变量中?
Private Sub Command1_Click()
Dim s As String
Dim i As Integer
Open "c:sql.txt" For Input As #1
Input #1, s
Debug.Print s
Close #1
以上只能把txt中的一行放到变量上,能不能不用循环就能把TXT所有内容放到变量上??
问题点数:100、回复次数:46Top
1 楼KiteGirl(小仙妹)回复于 2006-03-16 02:40:04 得分 0
谁说不能我宰了谁!你等着!我给你一个代码(敢不等我,我灭了你!)Top
2 楼KiteGirl(小仙妹)回复于 2006-03-16 03:04:49 得分 30
Private Sub Command1_Click()
Dim tText As String
tText = TextGetByFile("1.txt")
'Text1.MultiLine = True '需要你预先设置。
'这里的Text控件最大可以显示65536个文字,但是tText可以存储的远远超过这个数字。因此你不要因此以为这些函数只能操作65536个字符。
'如果有不懂的函数、方法可以查MSDN。如果我写的代码你有疑问,我可以随时回答。
Text1.Text = tText
End Sub
Public Function TextGetByFile(ByVal pFileName As String) As String
'读文件文本到String/
Dim tOutText As String
Dim tBytes() As Byte
tBytes() = BytesGetByFile(pFileName)
tOutText = StrConv(tBytes(), vbUnicode) '转换Bytes为String
TextGetByFile = tOutText
End Function
Public Sub TextPutToFile(ByVal pFileName As String, ByRef pText As String, Optional ByVal pFillFile As Boolean = False)
'写String文本到文件。
Dim tBytes() As Byte
tBytes() = StrConv(pText, vbFromUnicode) '转换String为Bytes
BytesPutToFile pFileName, pBytes(), pFillFile
End Sub
Public Function BytesGetByFile(ByVal pFileName As String) As Byte()
'从文件读Bytes
Dim tOutBytes() As Byte
Dim tOutBytes_Length As Long
Dim tFileNumber As Integer
tFileNumber = FreeFile
Open pFileName For Binary As #tFileNumber
Dim tFileSize As Long
tFileSize = LOF(tFileNumber)
tOutBytes_Length = tFileSize - 1
ReDim tOutBytes(tOutBytes_Length)
Get tFileNumber, 1, tOutBytes()
Close #tFileNumber
BytesGetByFile = tOutBytes()
End Function
Public Sub BytesPutToFile(ByVal pFileName As String, ByRef pBytes() As Byte, Optional ByVal pFillFile As Boolean = False)
'写Bytes到文件(FillFile是设置是否先清除文件到0再写,否则你写的内容比原文件短,则原文件不会缩短。)
Dim tFileNumber As Integer
tFileNumber = FreeFile
If pFillFile Then
Open pFileName For Output As #tFileNumber
Close #tFileNumber
End If
tFileNumber = FreeFile
Open pFileName For Binary As #tFileNumber
Put tFileNumber, 1, pBytes()
Close #tFileNumber
End Sub
Top
3 楼of123()回复于 2006-03-16 08:00:28 得分 5
Get 语句
将一个已打开的磁盘文件读入一个变量之中。
语法
Get [#]filenumber, [recnumber], varname
Get 语句的语法具有以下几个部分:
部分 描述
filenumber 必要。任何有效的文件号。
recnumber 可选。Variant (Long)。记录号(Random 方式的文件)或字节数(Binary 方式的文件),以表示在此处开始读出数据。
varname 必要。一个有效的变量名,将读出的数据放入其中。
说明
通常用 Put 将 Get 读出的数据写入一个文件。
文件中第一个记录或字节位于位置 1,第二个记录或字节位于位置 2,依此类推。若省略 recnumber,则会读出紧随上一个 Get 或 Put 语句之后的下一个记录或字节(或读出最后一个 Seek 函数指出的记录或字节)。所有用于分界的逗号都必须罗列出来,例如:
Get #4,,FileBuffer
下列规则适用于以 Random 方式打开的文件:
如果要读出的数据的长度小于 Open 语句的 Len 子句中所指定的长度,Get 会在某个边界之内读出随后的记录,在这里,边界的长度等于记录的长度。将此文件缓冲区内的现有内容填入到一个空间之内,该空间介于一个记录的结尾与下一个记录的开头之间。因为无法确定填入的数据量,所以,应设法使记录的长度与读出的数据长度一致,这通常是个好办法。
如果读出的变量是一个可变长度字符串,则 Get 语句先读出一个含有字符串长度的双字节描述符,然后读出放入变量中的数据。所以,Open 语句中的 Len 子句所指定的记录长度必须至少比字符串的实际长度多两个字节。
如果读出的变量是一个数值类型的 Variant,则 Get 先读出两个字节,识别 Variant 的 VarType,然后读出放入此变量中的数据。例如,在读出 VarType 3 的 Variant 时,Get 读出六个字节:前两个字节说明 Variant 为 VarType 3 (Long),后四个字节则包含 Long 类型数据。Open 语句中的 Len 子句所指定的记录长度必须至少比储存变量所需的实际长度多两个字节。
注意 可以使用 Get 语句从磁盘中读出一个 Variant 数组,但不能使用它读出包含数组的标量 Variant。也不能使用 Get 从磁盘中读出对象。
如果读出的变量是 VarType 8 (String) 的 Variant,则 Get 先读出两个字节,识别 VarType,接下来的两个字节指出字符串的长度,然后读出字符串数据。Open 语句中的 Len 子句所指定的记录长度必须比实际字符串的长度至少多四个字节。
如果读出的变量是一个动态数组,则 Get 会读出一个描述符,其长度等于 2 加上 8 乘以维数,即 2 + 8 * NumberOfDimensions。读出数组数据和数组描述符就需要占据字节,而 Open 语句中的 Len 子句所指定的记录长度必须大于或等於这些字节数的总和。 例如,在将数组写入磁盘时,下列数组声明需要 118 个字节:
Dim MyArray(1 To 5,1 To 10) As Integer
这 118 个字节的分配情况如下:18 个字节用于描述符 (2 + 8 * 2),100 个字节用于数据 (5 * 10 * 2)。
如果读出的变量是一个大小固定的数组,则 Get 只读出数据。它不读出描述符。
如果读出的变量是任何其他类型的变量(不是可变长度的字符串或 Variant£©,则 Get 只读出变量数据。Open 语句中的 Len 子句所指定的记录长度必须大于或等於要读出的数据的长度。
Get 在读出用户定义类型的元素时,好象是单独地读出每一个元素,只是不在元素之间进行填充。在磁盘上,(用 Put 写入的)用户定义的类型的动态数组之前有一个描述符,其长度等于 2 加上 8 乘以维数,即 2 + 8 * NumberOfDimensions。Open 语句中的 Len 子句所指定的记录长度必须大于或等於读出个别元素(包括任何数组及其描述符在内)所需的全部字节数总和。
对于以 Binary 方式打开的文件,Random 的所有规则都适用,但以下情况除外:
当 Open 语句中的 Len 子句不起作用时,Get 连续从磁盘中读出所有变量;也就是说,两个记录之间没有任何填充。
对于任何不属于用户定义的类型的数组,Get 只读出数据。它不会读出描述符。
Get 读出可变长度字符串,不管这些字符串是否具有长度为 2 字节的描述符,它们都不是用户定义的类型的元素。所读出的字节数等於字符串已包含的字符数。例如,下列语句从文件号为 1 的文件中读出十个字节:
VarString = String(10, )
Get #1,,VarStringTop
4 楼vansoft(Vansoft Workroom)回复于 2006-03-16 09:00:12 得分 5
直接用RichTextBox控件,
直接加載就行了。Top
5 楼xubo602112(xubo)回复于 2006-03-16 09:16:31 得分 5
将文本文件的内容一次读入一个变量,有个简单做法。
可用input(读入长度,文件号)
文件长度可用函数filelen(文件号)得到Top
6 楼xubo602112(xubo)回复于 2006-03-16 09:19:52 得分 0
另:使用input()函数需先打开文件。Top
7 楼faysky2(出来混,迟早是要还嘀)回复于 2006-03-16 09:21:59 得分 15
Private Sub Command1_Click()
Dim s As String
Open "c:sql.txt" For Binary As #1
s=space(lof(1))
get #1,1, s
Close #1
Debug.Print s
end subTop
8 楼viena(维也纳N02)回复于 2006-03-16 09:23:56 得分 0
dim s as string
Open "c:sql.txt" For Input As #1
s=StrConv(InputB(LOF(1), #1), vbUnicode) '将文件内容附给变量S
Close #1Top
9 楼viena(维也纳N02)回复于 2006-03-16 09:26:06 得分 0
文件中是Ansi格式,直接读不可以吧Top
10 楼highscore2(谢谢你的回答:p)回复于 2006-03-16 09:35:37 得分 0
楼上的给个实例语句就行了,这个帮助我也有.Top
11 楼highscore2(谢谢你的回答:p)回复于 2006-03-16 09:37:37 得分 0
谢谢,大家我去试试Top
12 楼highscore2(谢谢你的回答:p)回复于 2006-03-16 09:51:49 得分 0
用faysky2() ( ) 的方法,执行到get 语句的时候有错误提示
viena(维也纳nn-实心木头人) 的代码,可以读,但读出来的中文是乱码!!
我把贴子加分希望,高手继续回复.
Top
13 楼viena(维也纳N02)回复于 2006-03-16 09:58:02 得分 0
我晕,你的文件是Ansi,是Unicode,还是UTF8格式?Top
14 楼faysky2(出来混,迟早是要还嘀)回复于 2006-03-16 09:59:30 得分 0
如果是ANSI格式文件:
Private Sub Command1_Click()
Dim s As String
Open "c:\sql.txt" For Binary As #1
s = Space(LOF(1))
Get #1, 1, s
Close #1
Debug.Print s
End SubTop
15 楼viena(维也纳N02)回复于 2006-03-16 10:01:19 得分 0
用LOF得到文件长度
Redim Byte数组,再get
然后字节数组付给字符串Top
16 楼faysky2(出来混,迟早是要还嘀)回复于 2006-03-16 10:13:24 得分 0
我估计楼主的文件是UTF8格式的,如果是,用下面的代码吧
Private Sub Command1_Click()
Dim objStream As Object, s As String
Set objStream = CreateObject("ADODB.Stream")
With objStream
.Type = 2
.Mode = 3
.Open
.LoadFromFile "c:\sql.txt"
.Position = 0
.Charset = "UTF-8" ' 或 "Big5" 或其他編碼
s = .ReadText
' PS : 也可透过 .SaveToFile 方法保存文件
.Close
End With
Debug.Print s
Set objStream = Nothing
End SubTop
17 楼DengXingJie(杰西)回复于 2006-03-16 10:46:22 得分 0
路過
關注
收藏Top
18 楼highscore2(谢谢你的回答:p)回复于 2006-03-16 11:24:08 得分 0
我晕,你的文件是Ansi,是Unicode,还是UTF8格式?
================================================
有没有通用的方法???Top
19 楼xinliangyu(yxl)回复于 2006-03-16 11:28:50 得分 0
管你是哪种,一律按unicode也不会错Top
20 楼viena(维也纳N02)回复于 2006-03-16 11:34:58 得分 0
根据文件开头两个字节的不同,就知道文件是什么格式了,用二进制方式打开,在调试窗口打出来看看就知道区别了,然后根据不同格式再区别对待Top
21 楼viena(维也纳N02)回复于 2006-03-16 11:37:08 得分 0
如果以上的回复包括代码你都能看懂的话,应该就没有问题了,可以举一反三Top
22 楼rayxu(有心就成)回复于 2006-03-16 11:37:31 得分 0
高手多多,精彩,收藏学习!:)Top
23 楼KiteGirl(小仙妹)回复于 2006-03-16 13:47:34 得分 0
你只要把我的那些函数拷贝到程序里,然后:
把:
Private Sub Command1_Click()
Dim s As String
Dim i As Integer
Open "c:sql.txt" For Input As #1
Input #1, s
Debug.Print s
Close #1
改成:
Private Sub Command1_Click()
Dim s As String
s = TextGetByFile("c:sql.txt")
Debug.Print s
Top
24 楼LifeForCode(用生命编程.再入轮回(2007))回复于 2006-03-17 08:41:04 得分 0
近来学习的
另:发现KiteGirl(小仙妹)坐了沙发还发狠, 狂汗
Top
25 楼highscore2(谢谢你的回答:p)回复于 2006-03-17 08:44:50 得分 0
to KiteGirl(小仙妹): 你的代码是否适用于所有编码格式的文件??Top
26 楼highscore2(谢谢你的回答:p)回复于 2006-03-17 08:46:29 得分 0
因为KiteGirl(小仙妹)的代码太长看着不爽,所以没试了:)
但如果她的代码适用于所有编码格式的话就算很好了.Top
27 楼mosangbike(莫桑比克)回复于 2006-03-17 09:07:08 得分 0
牛之前先狠一把,狠完了才发现自己不是最牛的
怎么搞技术的也有这么多二愣子?Top
28 楼hsn1982(常年收购破铜烂铁)回复于 2006-03-17 09:15:15 得分 5
楼主自己的代码中加上循环读取就行了,注意边界。
或者使用FileSystemScript对象,比较简单Top
29 楼KiteGirl(小仙妹)回复于 2006-03-17 12:26:17 得分 0
支持两种格式:
Ansi
Private Sub Command1_Click()
Dim s As String
s = TextGetByFile("c:sql.txt")
Debug.Print s
Unicode
Private Sub Command1_Click()
Dim s As String
Dim bytes() As Bytes
bytes() = BytesGetByFile("c:sql.txt")
s=bytes()
Debug.Print s
UTF-8即使用Input也不行。不过只要写一个UTF-8转换模块就可以了。写这种转换函数是我的强项,UTF-8转换模块我目前还没写出来,不过有这个打算。
另外:我有一个Base64的编码解码程序。如果你要读Email里的Base64编码我可以给你。
Top
30 楼KiteGirl(小仙妹)回复于 2006-03-17 12:53:56 得分 0
如果你的文件确实是UTF-8编码,我现在就开始给你写一个UTF-8解码程序。另外请顶一下帖子,给我留出贴代码的地方来。Top
31 楼tiaoci(我挑刺,我快乐)回复于 2006-03-17 15:19:20 得分 0
为什么一定要一次性啊,显示你技巧高?
多次读有什么问题?
代码是用来解决问题的,不是用来显示技巧的
另外,KiteGirl 好残暴,哈哈 :D
Top
32 楼viena(维也纳N02)回复于 2006-03-17 15:23:21 得分 0
//多次读有什么问题?
IO硬件操作是瓶颈,分多次效率极低,如果文件很大,……Top
33 楼tiaoci(我挑刺,我快乐)回复于 2006-03-17 15:50:32 得分 15
你怎么知道效率低啊,有测试过吗?
文件系统和VB内部文件操作都是有缓冲区的!
另外 viena,你的编码检测是错误的,
"根据文件开头两个字节的不同,就知道文件是什么格式了,用二进制方式打开,在调试窗口打出来看看就知道区别了,然后根据不同格式再区别对待"
编码检测不是这么做的,自己gooogle吧
Top
34 楼viena(维也纳N02)回复于 2006-03-17 16:02:30 得分 0
可笑~Top
35 楼viena(维也纳N02)回复于 2006-03-17 16:51:40 得分 15
VB里有缓冲区没错,但不是万灵药;一次性读入为什么快?就是合理使用缓冲区的结果;分次操作每次也是使用缓冲区的,但逻辑上分开的操作不可能合并起来使用一个缓冲区,每次都要在硬盘重新定位位置初始位置。每次操作之间是可以加别的代码进行别的操作的!Top
36 楼viena(维也纳N02)回复于 2006-03-17 16:56:05 得分 0
编码检测是有问题,头两个字节只能鉴别出Unicode文件,Unicode文件有固定的文件头Top
37 楼tiaoci(我挑刺,我快乐)回复于 2006-03-17 17:09:02 得分 0
"但逻辑上分开的操作不可能合并起来使用一个缓冲区,
每次都要在硬盘重新定位位置初始位置。
每次操作之间是可以加别的代码进行别的操作的"
一看就知道没有学过操作系统,那还讨论各头啊
去做作试验吧Top
38 楼tiaoci(我挑刺,我快乐)回复于 2006-03-17 17:11:37 得分 0
另外编码检测可不光光是看前面几个字节就完事的
谁告诉你说unicode文件就 一定 有固定的文件头啊Top
39 楼viena(维也纳N02)回复于 2006-03-17 17:26:32 得分 0
楼上,不想鄙视你,但你跟我说什么操作系统,我没办法,我还以为你要跟我说VB的编译原理呢。我学操作系统的时候,你还不知道在哪儿呢!VB操作文件并不一定使用API吧,至少我知道二进制方式打开就是直接操作的~
//去做作试验吧
这句话对你更适用Top
40 楼tiaoci(我挑刺,我快乐)回复于 2006-03-17 17:49:58 得分 0
:(...........
我认输了。Top
41 楼gaoming007(哈哈)回复于 2006-03-17 18:25:37 得分 0
呵呵Top
42 楼davysnet(随风)回复于 2006-03-17 19:47:04 得分 0
大哥大姐们,你们没看他读的是个什么文件啊,SQL.TXT,他肯定是想读一个写在文本文件里面的SQL语句,还讨论什么码不码的。Top
43 楼aijie099(罗漫年华)回复于 2006-03-17 22:00:23 得分 0
有那么复杂吗????小改一下就行了啦:::::::
Private Sub Command1_Click()
Dim s As String
dim temp as string
Dim i As Integer
Open "c:sql.txt" For Input As #1
do
Input #1, s
temp=temp & left(s,len(s)-2) & " "
loop until eof(1)
Debug.Print temp
Close #1
以上只能把txt中的一行放到变量上,能不能不用循环就能把TXT所有内容放到变量上??
Top
44 楼aijie099(罗漫年华)回复于 2006-03-17 22:07:56 得分 0
你不用循环VB还是要用循环的.电脑是用循环的.无论用哪种方法,CPU都得一个字一个字的存取.
源程序就是要尽量简单明了.Top
45 楼chen9771(candy)回复于 2006-03-18 10:04:43 得分 5
filesystemobject,使用textstream,特方便Top
46 楼cxianfa(含笑)回复于 2006-03-18 14:44:40 得分 0
大家都成了牛人,虽然自己有很多长进,可是vb又好久没有用过了。学习Top




