CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VB >  基础类

vb能不能一次性把文本文件的内容读到一个string变量中?

楼主highscore2(谢谢你的回答:p)2006-03-16 02:19:32 在 VB / 基础类 提问

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

相关问题

  • 怎样将一个文本文件的内容付给一个 string 变量
  • 请问 关于VB读文本文件
  • vb文本文件读取得问题?
  • 如何将文本文件的内容读到变量中?
  • 如何用文本文件保存程序的一些变量??
  • 使用VB打开文本文件的问题(为了可移植性想用相对路径或字符串变量存储路径)很急,谢谢了
  • 如何从一个文本文件中读取其中的全部文本并存入一个STRING型的变量中?
  • VB中如何获得一个txt文本文件的行数?
  • VB如何实现对文本文件的加密?
  • 在VB中实现往word文档中写文本文件

关键词

  • 文件
  • 语句
  • 代码
  • 编码
  • 函数
  • 数据
  • 读出
  • 变量
  • 长度
  • 数组

得分解答快速导航

  • 帖主:highscore2
  • KiteGirl
  • of123
  • vansoft
  • xubo602112
  • faysky2
  • hsn1982
  • tiaoci
  • viena
  • chen9771

相关链接

  • Visual Basic类图书
  • Visual Basic类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo