精华内容
下载资源
问答
  • ASCII文件也称为文本文件,这种文件在磁盘中存放时每个字符对应一个字节,用于存放对应的ASCII码。例如,数5678的存储形式为: ASC码: 00110101 00110110 00110111 00111000 ↓ ↓ ↓ ↓ 十进制码: 5 6 7 8 ...

    从文件编码的方式来看,文件可分为ASCII码文件和二进制码文件两种。

      ASCII文件也称为文本文件,这种文件在磁盘中存放时每个字符对应一个字节,用于存放对应的ASCII码。例如,数5678的存储形式为:
    ASC码:  00110101 00110110 00110111 00111000
         ↓     ↓    ↓    ↓
    十进制码: 5     6    7    8 共占用4个字节。ASCII码文件可在屏幕上按字符显示, 例如源程序文件就是ASCII文件,用DOS命令TYPE可显示文件的内容。 由于是按字符显示,因此能读懂文件内容。

      二进制文件是按二进制的编码方式来存放文件的。 例如, 数5678的存储形式为: 00010110 00101110只占二个字节。二进制文件虽然也可在屏幕上显示, 但其内容无法读懂。C系统在处理这些文件时,并不区分类型,都看成是字符流,按字节进行处理。 输入输出字符流的开始和结束只由程序控制而不受物理符号(如回车符)的控制。 因此也把这种文件称作“流式文件”。  

                什么是流(stream)?

    流是程序输入或输出的一个连续的字节序列,设备(例如鼠标、键盘、磁盘、屏幕、调制解调器和打印机)的输入和输出都是用流来处理的。在C语言中,所有的流均以文件的形式出现----不一定是物理磁盘文件,还可以是对应于某个输入/输出源的逻辑文件。C语言提供了5种标准的流,你的程序在任何时候都可以使用它们,并且不必打开或关闭它们。以下列出了这5种标准的流。
    ------------------------------------------------
    名称 描 述 例 子
    ------------------------------------------------
    stdin 标准输入 键盘
    stdout 标准输出 屏幕
    stderr 标准错误 屏幕
    stdprn 标准打印机 LPT1端口
    stdaux 标准串行设备 COM1端口
    ------------------------------------------------
    需要注意的是,stdprn和stdaux并不总是预先定义好的,因为LPT1和COM1端口在某些操作系统中是没有意义的,而stdin,stdout和stderr总是预先定义好的。此外,stdin并不一定来自键盘,stdout也并不一定显示在屏幕上,它们都可以重定向到磁盘文件或其它设备上。

    文本模式(textmode)和二进制模式(binarymode)有什么区别?

    流可以分为两种类型:文本流和二进制流。文本流是解释性的,最长可达255个字符,其中回车/换行将被转换为换行符“/n”,(如果以"文本"方式打开一个文件,那么在读字符的时候,系统会把所有的"/r/n"序列转成"/n",在写入时把"/n"转成"/r/n"            archim 's opinion    )。二进制流是非解释性的,一次处理一个字符,并且不转换字符。
    通常,文本流用来读写标准的文本文件,或者将字符输出到屏幕或打印机,或者接受键盘的输入;而二进制流用来读写二进制文件(例如图形或字处理文档),或者读取鼠标输入,或者读写调制解调器。

    如果用文本方式打开文件,会把“0D 0A”自动变换成“/n”来存在内存中。写入的时候反向处理。    而二进制方式打开的话,就不会有这个过程。

    但是,Unicode/UTF/UCS格式的文件,必须用二进制方式打开和读写。
    展开全文
  • 文本文件和二进制文件学习

    千次阅读 2016-07-03 20:23:46
     二进制文件与我们通常使用的文本文件储存方式有根本的不同。这样的不同很难用言语表达,自己亲自看一看,理解起来会容易得多。因此,我推荐学习二进制文件读写的朋友安装一款十六进制编辑器。这样的编辑器有很多,...

    一).一般问题
      二进制文件与我们通常使用的文本文件储存方式有根本的不同。这样的不同很难用言语表达,自己亲自看一看,理解起来会容易得多。因此,我推荐学习二进制文件读写的朋友安装一款十六进制编辑器。这样的编辑器有很多,在我们的 CVF 附带的集成开发环境下就可以(将二进制文件拖动到 IDE 窗口后松开)。Visual Studio 2005 也是可以的。(不过需要在 File 菜单下 Open,File)
      另外推荐一款使用较多的软件,叫做 UltraEdit(以下简称 UE)。是很不错的文本编辑器,也能做十六进制编辑器使用。
      为什么要用十六进制编辑器?而不用 2 进制呢?因为 2 进制实在太小,书写起来会很长,很不直观。而我们的计算机把 8 位作为一个字节。刚好 2 ** 8 = 256 = 16 ** 2。用 8 位 2 进制表达的数,我们用 2 个十六进制数据来表达,更直观和方便。

    二).文件格式
      所有文件,笼统意义上将可以区分为两类,一类是文本文件,一类是二进制文件。

    1).文本文件
      文本文件用记事本等文本编辑器打开,我们可以看懂上面的信息。所以使用比较广泛。通常一个文本文件分为很多很多行,作为数据储存时,还有列的概念。实际上,储存在硬盘或其他介质上,文件内容是线一样储存的,列是用空格或 Tab 间隔,行是用回车和换行符间隔。
      以 ANSI 编码(使用较多)的文本文件来说,例如我们储存如下信息:

    引用
    10
    11
    12


      需要的空间是:3 行 × 每行 2 个字符 + 2 个回车符 + 2 个换行符 = 10 字节。文本文件储存数据是有格式,无数据类型的。比如 10 这个数据,并不指定是整型还是实型还是字符串。它有长度,就是 2,两个字节。储存时计算机储存它的 ASCII 码:31h,30h。(十六进制表示)。回车符是:0Dh,换行符:0Ah。
         因此,这个数据储存是这样的:

    引用
    31 30 0D 0A 31 31 0D 0A 31 32


      (红色为回车符和换行符) 31h 30h 就是 10,31h 31h 就是 11,31h 32h 就是 12。因此我们也可以认为文本文件是特殊的二进制文件。
    2).二进制文件
      二进制文件,是无格式有数据类型的。比如上面的 10 11 12 三个数。但二进制文件没有行的概念。我们要紧凑地储存他们。(当然也可以中间加入一些空白的字节)
      从数据类型上来说,我们首先考虑整型。如果把 10 11 12 当作 2 字长的整型。则 10 表示为:0Ah 00h。因为 0Ah 对应十进制 10。而后面的 00h 是空白位。2 字长的整型如果不足 FFh,也就是不足 255,则需要一个空白位。类似的:11 表示为 0Bh 00h,12 表示为 0Ch 00h。
      当整型数据超过 255 时,我们需要 2 个字节来储存。比如 2748(ABCh),则表示为:BCh 0Ah。要把低位写在前面(BCh),高位写在后面(0Ah)。
      当整型数据超过 65535 时,我们就需要 4 个字节来储存。比如 439041101(1A2B3C4Dh),则表示成:4Dh 3Ch 2Bh 1Ah。当数据再大时,我们就需要 8 字节储存了。
      二进制文件的实型数据也有字节长度的区分,比如 4 字长,8 字长。但实型数据的长度并不仅仅代表它的表达的范围,更多的代表精度。所以,8 字长的我们又称为双精度。关于实型数据如何储存为 2 进制。则有很多套规则。现在都广泛使用的是 IEEE 标准浮点格式。关于这样的规则,我还正在了解,比较麻烦。就不多说了。在这里也没有必要了解。
      二进制文件也可以储存字符型数据,储存方法和文本文件一样。都是使用 ASCII 编码储存的。所以我们用记事本打开某些二进制文件时,也能看到一些有意义的字符串。(无意义的乱码我们可以认为是整型或实型,不过记事本程序当作字符来解释,因此造成了乱码)

    三).使用二进制文件的好处
      为什么要使用二进制文件。原因大概有三个:
      第一是二进制文件比较节约空间,这两者储存字符型数据时并没有差别。但是在储存数字,特别是实型数字时,二进制更节省空间,比如储存 Real*4 的数据:3.1415927,文本文件需要 9 个字节,分别储存:3 . 1 4 1 5 9 2 7 这 9 个 ASCII 值,而二进制文件只需要 4 个字节(DB 0F 49 40)
      第二个原因是,内存中参加计算的数据都是用二进制无格式储存起来的,因此,使用二进制储存到文件就更快捷。如果储存为文本文件,则需要一个转换的过程。在数据量很大的时候,两者就会有明显的速度差别了。
      第三,就是一些比较精确的数据,使用二进制储存不会造成有效位的丢失。

    四).二进制文件的储存方式
         列举一个二进制文件如下:

    引用
    00000000h: 0F 01 00 00 0F 03 00 00 12 53 21 45 58 62 35 34 ; .........S!EXb54
    00000010h: 41 42 43 44 45 46 47 48 49 47 4B 4C 4D 4E 4F 50 ; ABCDEFGHIGKLMNOP


      这里列出的是在 UltraEdit(UE) 里看到的东西。其实只有红色部分是文件内容。前面的是 UE 加入的行号。后面的是 UE 尝试解释为字符型的参考。
      这个文件一共有 32 字节长。显示为两列,每列 16 个字节。实际上,这仅仅是 UE 的显示而已。真实的文件并不分行。仅仅知道这个文件的内容,如果我们没有任何说明的话,是不能看出任何有用信息的。
      下面我规定一下说明:我们认为,前 4 个字节是一个 4 字节的整型数据(0F 01 00 00 十六进制:10Fh 十进制:271)。这 4 个字节之后的 4 个字节是另一个 4 字节的整型数据(0F 03 00 00 十六进制:30Fh 十进制:783)。其后的 4 个字节(12 53 21 45 )表示一个 4 字节的实型数据:2.5811919E+3。再其后的 4 个字节(58 62 35 34)表示另一个 4 字节的实行数据:1.6892716E-7。而只后的 16 个字节(41 42 43 44 45 46 47 48 49 47 4B 4C 4D 4E 4F 50)我们认为是 16 个字节的字符串(ABCDEFGHIGKLMNOP)
      实际上,二进制文件只是储存数据,并不写明数据类型,比如上面的第 9 字节到第 16 字节(12 53 21 45 58 62 35 34),我们刚才认为是 2 个 4 字节的实型,其实也可以认为是 8 个字节的字符型( S!EXb54)。而后面的 16 个字节的字符串(ABCDEFGHIGKLMNOP),我们也可以认为是 2 个 8 字节的整型,或者 4 个 4 字节的整型,甚至 2 个 8 字节的实型,4 个 4 字节的实型,等等等等。
      因此,面对一个二进制文件,我们不能准确地知道它的含义,我们需要他的数据储存方式的说明。这个说明告诉我们第几个字节到第几个字节是什么类型的数据,储存的数据是什么含义。否则的话,我们只能猜测,或者无能为力。

    五).如何使用语句操作二进制文件
      我们将上面的那个二进制文件保存为:TestBin.Bin 来举例。
      读取和写入二进制其实是两个很类似的操作,了解了其中之一,另一个也就不难了。
      二进制文件我们通常使用直接读取方式,Open 语句可以写为:

    引用
    Open( 12 , File = 'TestBin.Bin' , Access = 'Direct' , Form = 'Unformatted' , RecL = 4 )


      上面的 Access 表示直接读取方式,Form 表示无格式储存。比较重要的是 RecL 。我们读取数据时,是用记录来描述单位的,每一次读入或写入是一个记录。记录的长度在 Open 时就确定下来,以后不能改变。如果需要改变,只能 Close 以后再此 Open。
      记录长度在某些编译器下表示读取的 4 字节长度的倍数,规定为 4 表示记录长度为 16 字节。有些编译器下就直接表示记录的字节数,规定为 4 则表示记录长度为 4 字节。这个问题需要参考编译器手册。在 VF 系列里,这个值是前面一个含义。可以通过设置工程属性的 Fortran,Data,Use Bytes as RECL= Unit for Unformatted Files 来改变,使之成为后一个含义。在命令行模式下,则使用 /assume:byterecl 这个编译选项。
      确定 RecL 大小是我们需要做的事情,一般来说,不适合太大,也不适合太小。还需要结合数据储存方式来考虑。太小的话,我们需要执行读写的次数就多,太大的话,我们就不方便操作小范围的数据。
      有时候我们甚至会分多次来读取数据,每一次的 RecL 都不同。对于上面的 TestBin.Bin 文件来说,它比较简单,我以 16 字节长度和 8 字节长度两种读取方式来演示,你甚至可以一次 32 个字节长度全部读完:
      (1)RecL = 4 【记录长度 16 字节】

    引用
    Program main
       Implicit None
       Integer*4 :: iVar1 , iVar2
       Real*4 :: rVar1 , rVar2
       Character(Len=16) :: cStr
       Open( 12 , File = 'TestBin.Bin' , Access = 'Direct' , Form = 'Unformatted' , RecL = 4 )
       Read( 12 , Rec = 2 ) cStr
       Read( 12 , Rec = 1 ) iVar1 , iVar2 , rVar1 , rVar2
       Write( * , * ) cStr
       Write( * , * ) iVar1 , iVar2 , rVar1 , rVar2
       Close( 12 )
    End Program main


      这里的 Open 里指定了 RecL = 4(记录长度是 16 字节)。
      第一个 Read 语句,直接读取第二笔记录(也就是第 17 字节到第 32 字节)。读取出的 cStr = "ABCDEFGHIGKLMNOP"。
      第二个 Read 语句,返回来读取第一笔记录(也就是前面 16 个字节)。读取出的数据分别放入 4 个 4 字节的变量。(其中前面两个是整型,后面两个是实型)
    输出结果为:
    ABCDEFGHIGKLMNOP
              271          783    2581.192       1.6892716E-07
      看到这个结果,就说明我们成功了。
      同时我们可以看到,第一个语句,我们直接跳到第二条记录读取,并没有读取第一条。这就是直接读取数据的方便。有时候我们根本不需要某些数据,这时候,我们可以直接跳到某一条记录上。这个记录甚至可以是我们实现算出来的变量。比如:
      iRec = ( a + b ) / C
         Read( 12 , Rec = iRec ) cStr
         实现我们储存了 100 天的数据,我们只需要第 21 天的数据,我们怎么办?在顺序读取时,我们可能会开辟一个 100 元素的数组,或者循环执行 20 次空白的读取。但是在直接读取时,我们只需要执行一句 Read( 12 , Rec = 21 )。这是多么的方便。(直接读取和顺序读取虽然于文本文件和二进制文件没有直接的关联,但是文本文件通常用顺序读取,而二进制文件通常用直接读取。这是他们的性质决定的。)
        (2)RecL = 2【记录长度为 8 字节】

    引用
    Program main
       Implicit None
       Integer*4 :: iVar1 , iVar2
       Real*4 :: rVar1 , rVar2
       Character(Len=16) :: cStr
       Open( 12 , File = 'TestBin.Bin' , Access = 'Direct' , Form = 'Unformatted' , RecL = 2 )
       Read( 12 , Rec = 4 ) cStr( 9 : 16 )
       Read( 12 , Rec = 3 ) cStr( 1 : 8   )
       Read( 12 , Rec = 1 ) iVar1 , iVar2 
       Read( 12 , Rec = 2 ) rVar1 , rVar2
       Write( * , * ) cStr
       Write( * , * ) iVar1 , iVar2 , rVar1 , rVar2
       Close( 12 )
    End Program main

        
      这里设定的 RecL = 2 ,意思是一笔记录 8 个字节。所以我们不能一次读取 cStr 这个 16 字节的字符串。我们必须分两次读取。第一次读取第 4 笔记录,放入字符串后半段。第二次读取第 3 笔记录,放入字符串前半段。(可以调换位置)。然后读取第一笔记录的两个整型变量和第二笔记录的两个实型变量。
      输出结果和(1)的方法一样。
      (3)写入二进制文件
      写入二进制文件同样需要考虑 RecL 的问题。我们这里以 RecL = 4 来举例。

    引用
    Program main
       Implicit None
       Open( 12 , File = 'TestBinW.Bin' , Access = 'Direct' , Form = 'Unformatted' , RecL = 4 )
       Write( 12 , Rec = 1 ) 271 , 783 , 2581.192_4 , 1.6892716E-07
       Write( 12 , Rec = 2 ) "ABCDEFGHIGKLMNOP"
       Close( 12 )
    End Program main



      写入二进制文件和读取二进制文件是差不多的,我就不再解释了。需要注意的是,如果直接写入第 N 笔记录,而文件没有只有 M 笔记录(M < N),那么,第 M+1 到第 N-1 笔记录会用 0 填充。也就是说,二进制文件不会出现断裂。

      二进制文件的读写是比较灵活的,实际应用中,我们使用哪种方式,我们应该根据自己的情况来设计。如何选择合适的记录长度 RecL,如何设计高效的储存方式等。

    展开全文
  • 加密程序会将来自文本文件的加扰的行写入到包含的文本文件中,该文件称为crypto.txt。 解密程序要求输入加密文件和索引文件(跟踪行索引)的名称。 加密文件的名称应为crypto.txt,索引文件的名称应为index.txt
  • 多样性数据源在报表开发中越来越常见,润乾集算报表对多样性数据源... 这里通过两个例子介绍集算报表使用文本数据源制作报表的步骤,对于小文本文件和大文本文件在集算报表中可以采用不同的方式进行处理。 小文本文件

            多样性数据源在报表开发中越来越常见,润乾集算报表对多样性数据源的有效支持使得这类报表开发变得非常简单,目前集算报表支持的数据源类型除传统的关系型数据库外,还支持:TXT文本、Excel、JSON、HTTP、Hadoop、mongodb等。

            这里通过两个例子介绍集算报表使用文本数据源制作报表的步骤,对于小文本文件和大文本文件在集算报表中可以采用不同的方式进行处理。

    小文本文件

    报表说明

            股票交易记录按月以文本形式存储,文件名为stock_record_yyyyMM.txt(如stock_record_200901.txt),文本内容包括股票代码、交易日期和收盘价。现根据指定日期精确查询某一只或几只股票的收盘价,以便进行股价趋势分析。文本内容如下:

           code                   tradingDate     price

           120089     2009-01-0100:00:00        50.24

           120123     2009-01-0100:00:00        10.35

           120136     2009-01-0100:00:00        43.37

           120141     2009-01-0100:00:00        41.86

           120170     2009-01-0100:00:00        194.63

     

           报表样式如下:


           输入查询日期和股票代码,查询到的交易信息:


            由于某天的股价信息只会存在一个文件中(按月存储),单个文件数据量并不是很大,因而可以将文件一次性加载到内存中完成数据查询。这里我们也将能够一次性读入内存进行计算的文件称为小文本文件。以下为具体实现:

    编写计算脚本

           使用集算编辑器编写脚本(p1.dfx),完成文件读入和数据过滤,为报表返回结果集。由于要接收报表传递的参数,首先设置脚本脚本参数。


           编辑脚本内容(右侧为格子运行后结果):

           A1:根据日期参数导入指定文件(一个);这里使用了f.import()将文本数据一次性读入内存,采用全内存方式完成数据计算,这也是处理小文件的常用方法;

           A2:根据指定日期和股票代码查询交易记录;

           A3:为报表返回结果集。

    编辑报表模板

             使用集算报表设计器新建报表模板,并设置参数:

             设置数据集,使用“集算器”数据集类型,调用编辑好的脚本文件(p1.dfx)

             其中,dfx文件路径既可以是绝对路径,也可以是相对路径,相对路径是相对选项中配置的dfx主目录的。

     

             编辑报表表达式,直接使用集算脚本返回的结果集,不再在报表中过滤,完成报表制作。

             通过上面的实现可以看到,使用集算器脚本可以很方便地完成文本文件的读取计算,而且外置的集算脚本具有可视化的编辑调试环境,编辑好的脚本还可以复用(被其他报表或程序调用)。不过,如果脚本已经调试好,而且不需要复用的时候,要维护两个文件(集算脚本和报表模板)的一致性会比较麻烦,这时候直接使用集算报表的脚本数据集就比较简单了。

             在脚本数据集中可以分步编写脚本完成计算任务,语法与集算器一致,还可以直接使用报表定义好的数据源(本例并未涉及)和参数。可以这样使用脚本数据集替代集算器数据集(集算脚本)部分(报表参数、表达式等部分与使用集算器数据集时完全一致,不再赘述):

           直接使用报表定义的参数date和code。

    大文本文件

            除了可以用小文本文件做为报表数据源,集算报表还可以读取大文本文件(无法一次性读入内存进行计算)。与小文本处理方式不同,集算报表采用外存计算的方式来处理大文件,这里也通过实例来说明。

            我们更改一下上面的报表需求,要求可以查询指定时间段的某些股票交易信息。由于时间跨度可大可小,所以需要读入的文件可能很多,这时无法将多个文件一次性加载到内存中进行计算,需要使用处理大文本的外存计算方式。以下为具体实现:

    编写计算脚本

           设置脚本参数。

           编辑脚本内容(右侧为格子运行后结果)。

           A1:根据日期范围计算需要查询的月份,以确定用到的文件;

           A2:循环所有月份,使用f.cursor()建立文件游标,并通过cs.conj@x()将多个游标合并为一个;与使用f.import()一次性读入内存不同,文件游标只是外存文件的引用,并未实际读入数据;

           A3:根据参数进行过滤,仍然返回游标;

           A4:使用cs.fetch()通过游标取出结果后为报表返回。

    编辑报表模板

           设置报表参数。

           设置数据集。

           编辑报表表达式。

            通过以上步骤即可完成大文件的读取计算。集算报表提供内外存不同的处理方式可以满足用户不同的报表需求,为文本文件数据源报表开发提供帮助。


    展开全文
  • 文本文件与二进制文件区别

    千次阅读 2018-11-15 13:50:18
    1)文本文件:这类文件以文本的ASCII码形式存储在计算机中。它是以"行"为基本结构的一种信息组织和存储方式。  2)二进制文件:这类文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂它们,只有...

     

    https://www.cnblogs.com/pengwangguoyh/articles/3223072.html

    1)文本文件:这类文件以文本的ASCII码形式存储在计算机中。它是以"行"为基本结构的一种信息组织和存储方式。 
    2)二进制文件:这类文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂它们,只有通过相应的软件才能将其显示出来。二进制文件一般是可执行程序、图形、图像、声音等等。

     

    C++标准库提供了基于输入/输出流机制的文件操作,叫做文件流(File Stream)。打开文件的时候,可以用参数制定按照二进制方式还是文本方式。

    然而,可能与你的想象不同的是,这里的二进制或者文本与文件的格式并没有任何关系,而是文件流操作时对数据的表达方式。

    文本方式和二进制方式的最大区别在于文本方式对于'\n'换行符的理解不同,在DOS平台下,该字符会被展开成<CR>< LF>两个控制字符(相当于"\r\n"),在ASCII字符集下是0DH,0AH,而在UNIX平台下,仅仅是<LF>,不会展开。而在二进制方式下,不管是什么平台,'\n'都是精确的<LF>。

    而类似于一个数学上的数字128,会在文件中以什么样的格式存储,是以数字形式存储(80H),还是对应的可读文本('1','2','8'),却和文件流的打开方式无关。

    在C++的文件流中,使用的术语叫做格式化输入输出操作和无格式化操作,前者也就是<<和>>运算符,将数字按照可读文本存储,后者是get/put成员函数,直接存储数字格式。

     

    一、文本文件与二进制文件的定义

        大家都知道计算机的存储在物理上是二进制的,所以文本文件与二进制文件的区别并不是物理上的,而是逻辑上的。这两者只是在编码层次上有差异。简单来说,文本文件是基于字符编码的文件,常见的编码有ASCII编码,UNICODE编码等等。二进制文件是基于值编码的文件,你可以根据具体应用,指定某个值是什么意思(这样一个过程,可以看作是自定义编码。

        从上面可以看出文本文件基本上是定长编码的(也有非定长的编码如UTF-8)。而二进制文件可看成是变长编码的,因为是值编码嘛,多少个比特代表一个值,完全由你决定。大家可能对BMP文件比较熟悉,就拿它举例子吧,其头部是较为固定长度的文件头信息,前2字节用来记录文件为BMP格式,接下来的8个字节用来记录文件长度,再接下来的4字节用来记录bmp文件头的长度。

    二、文本文件与二进制文件的存取  

      文本工具打开一个文件的过程是怎样的呢?拿记事本来说,它首先读取文件物理上所对应的二进制比特流,然后按照你所选择的解码方式来解释这个流,然后将解释结果显示出来。一般来说,你选取的解码方式会是ASCII码形式(ASCII码的一个字符是8个比特),接下来,它8个比特8个比特地来解释这个文件流。例如对于这么一个文件流"01000000_01000001_01000010_01000011"(下划线''_'',为了增强可读性手动添加的),第一个8比特''01000000''按ASCII码来解码的话,所对应的字符是字符''A'',同理其它3个8比特可分别解码为''BCD'',即这个文件流可解释成“ABCD”,然后记事本就将这个“ABCD”显示在屏幕上。

        事实上,世界上任何东西要与其他东西通信会话,都存在一个既定的协议,既定的编码。人与人之间通过文字联络,汉字“妈”代表生你的那个人,这就是一种既定的编码。但注意到这样一种情况,汉字“妈”在日本文字里有可能是你生下的那个人,所以当一个中国人A与日本B之间用“妈”这个字进行交流,出现误解就很正常的。用记事本打开二进制文件与上面的情况类似。记事本无论打开什么文件都按既定的字符编码工作(如ASCII码),所以当他打开二进制文件时,出现乱码也是很必然的一件事情了,解码和译码不对应嘛。例如文件流''00000000_00000000_00000000_00000001''可能在二进制文件中对应的是一个四字节的整数int 1,在记事本里解释就变成了"NULL_NULL_NULL_SOH"这四个控制符。

        文本文件的存储与其读取基本上是个逆过程。而二进制文件的存取显然与文本文件的存取差不多,只是编/解码方式不同而已,也不再叙述。

    三、文本文件与二进制文件的优缺点

        因为文本文件与二进制文件的区别仅仅是编码上不同,所以他们的优缺点就是编码的优缺点,这个找本编码的书来看看就比较清楚了。一般认为,文本文件编码基于字符定长,译码容易些;二进制文件编码是变长的,所以它灵活,存储利用率要高些,译码难一些(不同的二进制文件格式,有不同的译码方式)。关于空间利用率,想想看,二进制文件甚至可以用一个比特来代表一个意思(位操作),而文本文件任何一个意思至少是一个字符.

        在windows下,文本文件不一定是一ASCII来存贮的,因为ASCII码只能表示128的标识,你打开一个txt文档,然后另存为,有个选项是编码,可以选择存贮格式,一般来说UTF-8编码格式兼容性要好一些.而二进制用的计算机原始语言,不存贮兼容性.    很多书上还认为,文本文件的可读性要好些,存储要花费转换时间(读写要编译码),而二进制文件可读性差,存储不存在转换时间(读写不要编解码,直接写值).这里的可读性是从软件使用者角度来说的,因为我们用通用的记事本工具就几乎可以浏览所有文本文件,所以说文本文件可读性好;而读写一个具体的二进制文件需要一个具体的文件解码器,所以说二进制文件可读性差,比如读BMP文件,必须用读图软件.

        而这里的存储转换时间应该是从编程的角度来说的,因为有些操作系统如windows需要对回车换行符进行转换(将''\n'',换成''\r\n'',所以文件读写时,操作系统需要一个一个字符的检查当前字符是不是''\n''或''\r\n'').这个在存储转换在Linux操作系统中并不需要,当然,当在两个不同的操作系统上共享文件时,这种存储转换又可能出来(如Linux系统和Windows系统共享文本文件)。关于这个转换怎样进行,我将在下一篇文章《Linux文本文件与Windows文本文件间的转换》给出^_^

    四、C的文本读写和二进制读写

        应该说C的文本读写与二进制的读写是一个编程层次上的问题,与具体的操作系统有关,所以"用文本方式读写的文件一定是文本文件,用二进制读写的文件一定是二进制文件"这类观点是错误的.下面的讲述非明确指出操作系统类型,都暗指windows.

        C的文本方读写与二进制读写的差别仅仅体现在回车换行符的处理上.文本方式写时,每遇到一个''\n''(0AH换行符),它将其换成''\r\n''(0D0AH,回车换行),然后再写入文件;当文本读取时,它每遇到一个''\r\n''将其反变化为''\n'',然后送到读缓冲区.正因为文本方式有''\n''--''\r\n''之间的转换,其存在转换耗时.二进制读写时,其不存在任何转换,直接将写缓冲区中数据写入文件.

        总地来说,从编程的角度来说,C中文本或二进制读写都是缓冲区与文件中二进制流的交互,只是文本读写时有回车换行的转换.所以当写缓冲区中无换行符''\n''(0AH),文本写与二进制写的结果是一样的,同理,当文件中不存在''\r\n''(0DH0AH)时,文本读与二进制读的结果一样.

    五、实例

    C的文本读写和二进制读写     应该说C的文本读写与二进制的读写是一个编程层次上的问题,与具体的操作系统有关,所以"用文本方式读写的文件一定是文本文件,用二进制读写的文件一定是二进制文件"这类观点是错误的.下面的讲述非明确指出操作系统类型,都暗指windows.

        C的文本方读写与二进制读写的差别仅仅体现在回车换行符的处理上.文本方式写时,每遇到一个''\n''(0AH换行符),它将其换成''\r \n''(0D0AH,回车换行),然后再写入文件;当文本读取时,它每遇到一个''\r\n''将其反变化为''\n'',然后送到读缓冲区.二进制读写时,其不存在任何转换,直接将写缓冲区中数据写入文件.对于内容为 “Ab123\r\n" (41 62 31 32 33 0D 0A)的文件,

    复制代码

    复制代码

    pf1 = fopen("f:\\1.txt","r");// 或者pf1 = fopen("f:\\1.txt","rb");
    for(int i=0;i <6;i++)
    {
       fread(&a[i],1,1,pf1);
       printf("%0X ",a[i]);
    }
    fclose(pf1);//关闭文件

    复制代码

    复制代码

     

     

    的结果分别为: 41 62 31 32 33 0A          和     41 62 31 32 33 0D  5678的存储形式为:ASCII码:    00110101   00110110   00110111   00111000  (四个字节) 5678的存储形式为:二进制:      00010110   00101110  (两个字节) 二进制文件和文本文件的唯一差异就是前者含有一些非标准输出的ASCII码。0x01就是非标准输出的ASCII码,

    0x61就是标准输出的ASCII码。)

     

     

     

    一. 基本知识:
    --------------------------------------------------转----------------------------------------------------
    1. 二进制文件与文本文件的区别:
    将文件看作是由一个一个字节(byte) 组成的, 那么文本文件中的每个字节的最高位都是0,也就是说文本文件使用了一个字节中的七位来表示所有的信息,而二进制文件则是将字节中的所有位都用上了。这就是两者的区别;接着,第二个问题就是文件按照文本方式或者二进制方式打开,两者会有什么不同呢?其实不管是二进制文件也好,还是文本文件也好,都是一连串的0和1,但是打开方式不同,对于这些0和1的处理也就不同。如果按照文本方式打开,在打开的时候会进行translate,将每个字节转换成ASCII码,而以按照二进制方式打开的话,则不会进行任何的translate;最后就是文本文件和二进制文件在编辑的时候,使用的方式也是不同的。譬如,你在记事本中进行文本编辑的时候,你进行编辑的最小单位是字节(byte);而对二进制文件进行编辑的话,最小单位则是位(bit),当然我们都不会直接通过手工的方式对二进制文件进行编辑了。

    从文件编码的方式来看,文件可分为ASCII码文件和二进制码文件两种:
    ASCII文件也称为文本文件,这种文件在磁盘中存放时每个字符对应一个字节,用于存放对应的ASCII码。例如,数5678的存储形式为: 
    ASCII码: 00110101 00110110 00110111 00111000 
    ↓  ↓      ↓   ↓
    十进制码: 5     6   7      8 

    共占用4个字节。ASCII码文件可在屏幕上按字符显示,例如源程序文件就是ASCII文件,用DOS命令TYPE可显示文件的内容。由于是按字符显示,因此能读懂文件内容。

    二进制文件是按二进制的编码方式来存放文件的。例如,数5678的存储形式为:00010110 00101110 只占二个字节。二进制文件虽然也可在屏幕上显示,但其内容无法读懂。C系统在处理这些文件时,并不区分类型,都看成是字符流,按字节进行处理。输入输出字符流的开始和结束只由程序控制而不受物理符号(如回车符)的控制。因此也把这种文件称作“流式文件”。 

    2. 文本模式(textmode)和二进制模式(binarymode)有什么区别? 

    流可以分为两种类型:文本流和二进制流。文本流是解释性的,最长可达255个字符,其中回车/换行将被转换为换行符“\n”,(如果以"文本"方式打开一个文件,那么在读字符的时候,系统会把所有的"\r\n"序列转成"\n",在写入时把"\n"转成"\r\n" )。二进制流是非解释性的,一次处理一个字符,并且不转换字符。

    注:

     

    \n一般会操作系统被翻译成"行的结束",即LF(Line-Feed)
    \r会被翻译成"回车",即CR(Cariage-Return)
    对于文本文件的新行,在UNIX上,一般用\n(LF)来表示,Mac上用\r(CR)来表示,
    Windows上是用\n\r(CR-LF)来表示。 

    通常,文本流用来读写标准的文本文件,或者将字符输出到屏幕或打印机,或者接受键盘的输入;而二进制流用来读写二进制文件(例如图形或字处理文档),或者读取鼠标输入,或者读写调制解调器。如果用文本方式打开二进制文件,会把“0D 0A”自动变换成“\n”来存在内存中。写入的时候反向处理。而二进制方式打开的话,就不会有这个过程。但是,Unicode/UTF/UCS格式的文件,必须用二进制方式打开和读写。

     

    ---------------------------------------------------------------------------------------------------------

    上述基础其实大可以略过,简言之,对用户来说:在 matlab 中存储成为二进制还是文本文件取决于fopen的方式,如果用wt,则存储为文本文件,这样用记事本打开就可以正常显示了;如果用w则存储为二进制文件,这样用记事本打开会出现小黑方块,要正常显示的话,可以用写字板或UltraEdit等工具打开。

    二. Matlab的I/O文件操作使用技巧和总结:

    1. Matlab 支持的I/O文件(对应“取/存”操作)类型:(所有文件I/O程序不需要特殊的工具箱)
    http://www.mathworks.com/support/tech-notes/1100/1102.html

    (注:从上表可以看到,matlab不支持doc格式的文档存取(因为doc文档包含很多格式控制符),请改用txt或者dat格式)

    2. Matlab 的I/O文件指南:
    http://www.mathworks.com/support/tech-notes/1600/1602.html


    以下是部分对应的中文译文:
    --------------------------------------------------------------转----------------------------------------
    本技术支持指南主要处理:ASCII, binary, and MAT files.
    要得到MATLAB中可用来读写各种文件格式的完全函数列表,可以键入以下命令:
    help iofun

    MATLAB中有两种文件I/O程序:high level and low level.
    High level routines: 包括现成的函数,可以用来读写特殊格式的数据,并且只需要少量的编程。
    Low level routines: 可以更加灵活的完成相对特殊的任务,需要较多的额外编程。
     

    High level routines 包括现成的函数,可以用来读写特殊格式的数据,并且只需要少量的编程。

    举个例子,如果你有一个包含数值和字母的文本文件(text file)想导入MATLAB,你可以调用一些low level routines自己写一个函数,或者是简单的用TEXTREAD函数。

    使用high level routines的关键是:文件必须是相似的(homogeneous),换句话说,文件必须有一致的格式。下面的段落描述一些high level file I/O routines并给出一些例子帮助理解概念。

    LOAD/SAVE

    主要的high level file I/O routines 是LOAD 和 SAVE函数。LOAD
    可以读MAT-file data或者用空格间隔的格式相似的ASCII data. SAVE可以将MATLAB变量写入MAT-file格式或者空格间隔的ASCII data。大多数情况下,语法相当简单。下面的例子用到数值由空格间隔的ASCII file sample_file.txt :

    1 5 4 16 8

    5 43 2 6 8

    6 8 4 32 1

    90 7 8 7 6

    5 9 81 2 3

     

     

     

    Example:
    用 LOAD and SAVE 读写数据

     


    CODE:
    % Load the file to the matrix, M :
    M = load('sample_file.txt') 
    % Add 5 to M :
    M = M +5 
    % Save M to a .mat file called 'sample_file_plus5.mat':
    save sample_file_plus5 M

    % Save M to an ASCII .txt file called 'sample_file_plus5.txt' :
    save sample_file_plus5.txt M -ascii 


     

     

    UIGETFILE/UIPUTFILE

     

     

     

    UIGETFILE/UIPUTFILE是基于图形用户界面(GUI)的。会弹出对话框,列出当前目录的文件和目录,提示你选择一个文件。UIGETFILE让你选择一个文件来写(类似Windows ‘另存为’选项?)。用UIGETFILE,可以选择已存在的文件改写,也可以输入新的文件名。两个函数的返回值是所选文件名和路径。

     

     

     

    Example:
    用 UIGETFILE 从当前目录选择一个 M-file

     

     

     


    CODE:
    % This command lists all the M-files in the current directory and
    % returns the name and path of the selected file
    [fname,pname] = uigetfile('*.m','Sample Dialog Box') 
     

     

    注意: UIGETFILE 一次只能选择一个文件。

     

     

     

    UIIMPORT/IMPORTDATA

     

     

     

    UIIMPORT是一个功能强大,易于使用的基于GUI的high level routine,用于读complex data files。文件也必须是homogeneous。

     

     

     

    IMPORTDATA形成UIIMPORT的功能,不打开GUI。可以将IMPORTDATA用于函数或者脚本中,因为在函数或者脚本中基于GUI的文件导入机制并不理想。下面的例子用到包含几行文件头和文本、数值数据的文件'sample_file2.txt' :

     

     

     

    This is a file header.

     

     

     

    This is file is an example.

     

     

     

    col1 col2 col3 col4

     

     

     

    A 1 4 612.000

     

     

     

    B 1 4 613.000

     

     

     

    C 1 4 614.000

     

     

     

    D 1 4 615.000

     

     

     

    Example: Using IMPORTDATA to read in a file with headers, text, and numeric data

     

     

     


    CODE:

    % This reads in the file 'sample_file2.txt' and creates a
    % structure D that contains both data and text data.
    % Note the IMPORTDATA command specifies a white space 
    % as the delimiter of the file, but IMPORTDATA can usually 
    % detect this on its own 

    D = importdata('sample_file2.txt','') % 原文有误?

    D = importdata('sample_file2.txt')

     

     

     

     

    可以通过访问结构D的数据和文本域,来看结构D中的真实值,例如输入:

     

     

     

    data = D.data

     

     

     

    text = D.textdata

     

     

     

    可以用UIIMPORT读同一个文件并得到同样的结构.

     

     

     

    注意: 对于 ASCII data, 你必须检验导入向导正确的识别了列分隔符。

     

     

     

    TEXTREAD/STRREAD

     

     

     

    TEXTREAD 是一个强大的动态high level routine,设计用来读ASCII格式的文本和/或数值数据文件。STRREAD除是从字符串而不是文件读以外,类似于TEXTREAD

     

     

     

    两个函数可以用许多参数来改变其具体的工作方式,他们返回读入指定输出的数据。他们有效的提供给你一个
    “两全其美”的方法,因为他们可以用一个命令读入混合的ASCII和数值数据(high level routines的做法),并且你可以改变他们以匹配你特定的应用(如同low level routines做到的)。例子:

     

     

     


    CODE:

    Example 1: Using TEXTREAD to read in an entire file into a cell array
    % This command reads in the file fft.m into the cell array, file 
    file = textread('fft.m','%s','delimiter','\n','whitespace',''); 
    CODE:

    Example 2: Using STRREAD to read the words in a line
    % This command uses the cell array created in Example 1 to 
    % read in each word of line 28 in 'file' to a cell array, words
    words = strread(file{28},'%s','delimiter','')

     


    CODE:

    Example 3: Using TEXTREAD to read in text and numeric data from a file with headers

    % This command skips the 2 header lines at the top of the file
    % and reads in each column to the 4 specified outputs
    [c1 c2 c3 c4] = textread('sample_file2.txt','%s %s %s %s','headerlines',2)

     

    CODE:

    Example 4: Using TEXTREAD to read in specific rows of text and numeric data from a file

    % This command reads in rows B and C of the file. The 'headerlines'
    % property is used to move down to the desired starting row and the 
    % read operation is performed 2 times 

    [c1 c2 c3 c4] = textread('sample_file2.txt',... 
    '%s %s %s %s',2,'headerlines',4) 



    CODE:

    Example 5: Using TEXTREAD to read in only the numeric data from a file containing text and numbers

    % This command reads in only the numeric data in the file. The
    % 'headerlines' property is used to move down to the first row 
    % of interest and the first column of text is ignored with the 
    % '*' operator 

    [c2 c3 c4] = textread('sample_file2.txt','%*s %d %d %f','headerlines',3) 

     

     

     

     

    DLMREAD/DLMWRITE/CSVREAD

     

     

     

    DLMREAD 和 DLMWRITE函数能够读写分隔的ASCII data,而不是用low level routines。他们比low level routines容易使用,Low level routines用几行代码实现的功能可以用DLMREAD/DLMWRITE简化成一行。

     

     

     

    CSVREAD用来读分隔符是逗号的文件,是DLMREAD的特殊情况。当读空格和Tab分隔的电子数据表文件时,DLMREAD特别有用。以'sample_file.txt'为例:

     

     

     

     

     


    CODE:

    Example 1: Using DLMREAD to read in a file with headers, text, and numeric data

    % This reads in the file 'sample_file2.txt' and creates a matrix, D,
    % with the numeric data this command specifies a white space as the
    % delimiter of the file 

    D = dlmread('sample_file.txt','') 






    CODE:

    Example 2: Using DLMREAD to extract the first 3 columns of the last 3 rows

    % This reads in the first 3 columns of the last 3 rows of
    % the data file 'sample_file.txt'into the matrix, D_partial.
    % 读文件 'sample_file.txt' 前3列后3行,到矩阵D_partial.

    D_partial = dlmread('sample_file.txt','',[2 0 4 2]) 






    CODE:

    Example 3: Using DLMWRITE to write a comma delimited file

    % This creates a file called 'partialD.txt' that consists of 
    % the first 3 columns of the last 3 rows of data where each
    % element is separated by a comma 

    dlmwrite('partialD.txt',D_partial,',') 


     

     

    注意: 保证DLMREAD and DLMWRITE指定范围的指标从0开始,而不是从1开始。

     

     

     

    WK1READ/WK1WRITE

     

     

     

    WK1READ 用来读Lotus123 电子数据表文件的数据;WK1WRITE用来写矩阵到Lotus123 电子数据表文件。

     

     

     

    XLSREAD

     

     

     

    XLSREAD用来读Excel的数值和文本数据。

     


    ---------------------------------------------------------------------------------------------------------

    三. 具体例子分析:
    Matlab网站用两个例子非常详尽地介绍了各个命令的基本用法,实际中,面对手头上的数据,如何选用合适的命令呢?以下结合几个示例给出一些总结,大家举一反三就可以了:

    1. 纯数据(列数相同):
    源文件:



    CODE:
    0 3866.162 2198.938 141.140
    1 3741.139 2208.475 141.252
    2 3866.200 2198.936 141.156
    3 3678.048 2199.191 141.230
    4 3685.453 2213.726 141.261
    5 3728.769 2212.433 141.277
    6 3738.785 2214.381 141.256
    7 3728.759 2214.261 141.228
    8 3748.886 2214.299 141.243
    9 3748.935 2212.417 141.253
    10 3733.612 2226.653 141.236
    11 3733.583 2229.248 141.223
    12 3729.229 2229.118 141.186




    解答:对于这个txt文件,由于各行列数相同,故简单地使用load,importdata均可。


    2.字段名(中、英文字段均可)+数据:
    源文件:


    CODE:
    CH0 CH1 CH2 CH3
    0.000123 0.000325 0.000378 0.000598
    0.000986 0.000256 0.000245 0.000698


    解答:由于是记录的形式,因此各行列数必相同(缺少部分列时请自行在文件中补上 Inf 或 NaN),故直接使用 importdata 便可。

    3.注释(含有独立的数字串)+数据(列数相同):
    问题:这个文件有4列,但前6行是文字说明,4列数字是从第8行开始的.现在我想把这个文件的前2列和文字说明提出来组成一个新的dat文件

    源文件:


    CODE:
    Group 2 12.02.2006 Limei
    Samples of datas: 50000

    CH0 CH1 CH2 CH3
    0.000123 0.000325 0.000378 0.000598
    0.000986 0.000256 0.000245 0.000698


    目标文件:


    CODE:
    Group 2 12.02.2006 Limei
    Samples of datas: 50000

    CH0 CH1
    0.000123 0.000325
    0.000986 0.000256


    解答:由于注释中含有独立的数字串,且注释部分没有明显的格式,这时候用importdata, load等高级命令直接读取会失败,用 textread, dlmwrite 等格式化命令也不太合适,因此只能使用低级命令进行读取。(当然了,可以跳过注释部分直接用高级命令读取数据,即:[a b c d] = textread(filename,'%f %f %f %f','headerlines',4); )。一个简单的、非通用的包含注释的读取方法如下:
    -------------------------------------转 ---------------------------------------------------------------------------------------

    CODE:
    clc;clear;
    fid = fopen('exp.txt', 'r');
    fid_n=fopen('ex.dat','w');
    while ~feof(fid)
    tline=fgetl(fid);
    if ~isempty(tline)
    if double(tline(1))>=48 && double(tline(1))<=57 %数值开始
    a=strread(tline);
    a(3:4)=[];
    fprintf(fid_n,'%f %f\n',a);
    clear a;
    elseif double(tline(1))==67 %字母C开始
    [b1,b2,b3,b4]=strread(tline,'%s %s %s %s');
    b=[b1{1},' ',b2{1}];
    fprintf(fid_n,'%s\n',b);
    clear b b1 b2 b3 b4;
    else
    fprintf(fid_n,'%s\n',tline);
    end
    else
    fprintf(fid_n,'%s\n',tline);
    end
    end
    fclose(fid);
    fclose(fid_n);


    ---------------------------------------------------------------------------------

    4. 注释(不含独立的数字串)+数据(列数相同):
    源文件:

    CODE:
    你好 abc
    欢迎来到 我们
    振动论坛
    vib.hit.edu.cn
    1 11 111 1111
    2 22 222 2222
    3 33 333 3333
    4 44 444 4444
    5 55 555 5555


    解答:直接用 importdata 便可

    注:有时候注释中含有独立的数字串也可以 importdata 成功,不过得到的结果有可能不正确,建议这时候使用第3种情形的读取方式。

    5. 注释与数据混排:
    对此当然只能自己编程,举例:

    源文件

    CODE:
    1 11 111 1111
    你好
    2 22 222 2222
    欢迎来到
    3 33 333 3333
    振动论坛
    4 44 444 4444
    vib.hit.edu.cn
    5 55 555 5555


    解答:
    --------------------------------------------转--------------------------------------
    CODE:

    function [data]=distilldata(infile)
    %功能说明:
    %将保存数据的原始文件中的数值数据读入到一个data变量中
    %使用说明:
    % infile——原始数据文件名;
    % data=数据变量

    tmpfile='tmp2.mat';

    fidin=fopen(infile,'r'); % 打开原始数据文件(.list)

    fidtmp=fopen(tmpfile,'w'); % 创建保存数据文件(不含说明文字)

    while ~feof(fidin) % 判断是否为文件末尾
    tline=fgetl(fidin); % 从文件读入一行文本(不含回车键)
    if ~isempty(tline) % 判断是否空行
    [m,n]=size(tline);
    flag=1;
    for i=1:n %判断一行中有没有字符(+-.Ee和空格键除外)
    if ~(tline(i)==' '|tline(i)=='-'|tline(i)=='.'|tline(i)=='E'...
    |tline(i)=='e'|tline(i)=='+'...
    |(double(tline(i))>=48&&double(tline(i))<=57))
    flag=0;
    break;
    end
    end
    if flag==1 % 如果是数字行,把此行数据写入文件
    fprintf(fidtmp,'%s\n',tline);
    end
    end
    end
    fclose(fidin);
    fclose(fidtmp);
    data=textread(tmpfile);
    delete(tmpfile);

    ---------------------------------------------------------------------------------------------------------
    另外,如果要求不高,也可以使用 textread 函数跳过注释部分进行读取,不过前提是需要事先知道文件内容的结构(即哪行是数据、哪行是注释)

    6.各列数据的分离:
    源文件:


    CODE:
    0 + 47038.7 1.05 09:26:07 C
    2 + 46477.7 1.03 09:28:38 C 
    4 + 44865.7 1.04 09:28:48 C 
    6 + 41786.4 1.03 09:28:56 C 
    8 + 39896.0 0.97 09:29:03 C 
    10 + 37518.4 0.93 09:29:15 C 
    12 + 35858.5 0.92 09:29:30 C 
    14 + 46105.0 1.03 09:30:21 C 
    16 + 46168.6 6.89 09:30:30 C 
    18 + 48672.3 4.33 09:30:40 C 
    20 + 49565.7 0.49 09:30:48 C 
    22 + 49580.7 0.53 09:30:55 C 
    24 + 49602.3 0.84 09:31:03 C 
    26 + 49582.5 1.51 09:31:11 C 
    28 + 49577.0 1.39 09:31:19 C 
    30 + 49589.3 0.61 09:31:27 C 
    32 + 49578.3 1.06 09:31:29 C 
    34 + 49512.5 1.77 09:31:38 C 

    解答:直接用 [a,b,c,d,e,f]=textread(yourfilename,'%d %c %f %f %s %c'); 便可


    四. 注意事项:

     

    1. 请在 matlab 中保持当前路径在该数据文件对应的目录下进行存取,否则,存取时请给出该数据文件的具体路径。

     

     

     

    2. 存取时,请给出该数据文件的全称(包括后缀名,读取mat文件时可省略)

     

     

     

    3. load data.txt和A=load(‘data.txt’)的区别请参阅精华贴:[原创]写给学习 matlab 的新手们

     

     

     

    4. 请根据读写需要来打开文件,即根据你的需要来指定 fopen 的 permission 属性为读或写。如果只用 a 进行写入,就不能用 fread 读取。此时应该写完关闭文件,然后用 r 打开读取,或者直接用 a+ 进行同时读写操作。否则,会产生莫名其妙的问题!以下代码是一个错误的例子:

     

     

     

    CODE:

    filename='e.dat';
    fid=fopen(filename,'a');
    if fid<0
    error('fopen error');
    end
    s=[1 2 3 4;5 6 7 8];
    fwrite(fid,s,'float32')
    [dd ll]=fread(fid,inf,'float32');%把t中的数据全部读出,即s矩阵。
    fclose(fid);
     

     

    此时得到的dd, ll 是错误且无意义的!

     


    五. 其他相关问题:

    1. 连续读取多个文件的数据,并存放在一个矩阵中:
    (1) 首先是如何读取文件名:
    方法一:
    filename=dir(‘*.jpg’);
    那么第i个文件的文件名就可以表示为
    filename(i).name
    文件数量为:length(filename)

    方法二:
    先在Windows的 MSDOS(命令行)中使用以下命令生成一个list.txt文件:

     

    dir path\folder /on /b /s > path\list.txt

     

    举例:dir d:\test /on /b /s > d:\list.txt

     

    然后在 matlab 中使用:

     

    filename = textread(sFileFullName,'%s');

     

    把所有文件名读取到list细胞矩阵中,最后对filename{i}便可得到各文件名。

     


    (2) 然后是读取文件名的数据并存储:
    假设每个文件对应的数据是m*n的,则:

    CODE:
    k = length(filename);
    Data = zeros(m,n,k);
    for ii = 1:k
    Data(:,:,ii) = yourreadstyle(filename{ii}); %yourreadstyle是对应的文件读取方式的函数
    end

    2. 连续读取多个文件的数据,并存放在多个矩阵(以文件名命名)中:
    假设每个文件对应的数据是m*n的,则以上述第二种文件名读取方法为例:

    CODE:
    k = length(filename);
    for ii = 1:k
    D = yourreadstyle(filename{ii});
    eval([‘Data_’, num2str(ii), ‘ = D;’]);
    end



    3. 文件名命名问题:
    文件名为 abc00001,abc00002,... abc00009,abc00010,... abc00099,abc00100,...abc00879. 准备把这些文件名给放到一个数组里面去。

    解答:

    CODE:
    a=cell(879,1);
    for k=1:879
    a{k} = sprintf('%.5d',k);
    end


    4. 上述各种文件格式、类型自动识别问题:可以利用正则表达式来处理,使之通用性较强。例如使用以下代码可以自动处理上面提到了例1到例5各种情形,不过由于存在自动判断,对某些例子(如例1)效率自然要低一点,而对于另外的例子(如例3、例5)效率估计要高一点(少用了一个循环)。

    CODE:
    function [data]=distilldata_eight(infile)
    %功能说明:
    %将保存数据的原始文件中的数值数据读入到一个data变量中(自动判断数据行)
    %使用说明:
    % infile——原始数据文件名;
    % data=数据变量
    tmpfile='tmp2.mat';
    fidin=fopen(infile,'r'); % 打开原始数据文件(.list)
    fidtmp=fopen(tmpfile,'w'); % 创建保存数据文件(不含说明文字)
    while ~feof(fidin) % 判断是否为文件末尾
    tline=fgetl(fidin); % 从文件读入一行文本(不含回车键)
    if ~isempty(tline) % 判断是否空行
    str = '[^0-9 | \. | \- | \s | e | E]'; %正则表达式为:该行中是否包含除 - . E e 数字 和 空白字符 外的其他字符
    start = regexp(tline,str, 'once');
    if isempty(start)
    fprintf(fidtmp,'%s\n',tline);
    end
    end
    end
    fclose(fidin);
    fclose(fidtmp);
    data=textread(tmpfile);
    delete(tmpfile)



    5. 大量数据的读取问题:
    可以考虑使用循环分批读取(特别是在各数据是独立的时候),或者使用稀疏矩阵来实现(对此可以参阅本版精华贴: [原创]提高matlab运行速度和节省空间的一点心得(之三))。另外,也可参考《深入浅出MATLAB 7_X混合编程》一书第一章

    6. 读取整个txt文件的内容(获得文件中的所有字符):

    CODE:

    f = fopen('yourfilename.txt','rt'); % t 属性根据需要可省略
    x = fread(f,'*char');
    fclose(f);


    7. 把维数不同的矩阵及其变量名保存到一个 txt 文件中,例如 a1 = 123; a2 = [1 2 3;4 5 6] ,希望得到的 txt 文件如下:


    QUOTE:

    a1
    123
    a2:
    1 2 3
    4 5 6






    如果写入的时候简单一点,则可以采用以下方式,不过读取的时候比较麻烦:

    CODE:

    a1=123;
    a2=[1 2 3;4 5 6];
    fid = fopen('myfile.txt', 'wt');
    for i=1:2
    fprintf(fid, '%s: \n %s\n', ['a',int2str(i)], mat2str(eval(['a',int2str(i)])));
    end
    fclose(fid);


    相反,如果写入的时候复杂一点,则读取的时候会简单一点:

    CODE:

    a1=123;
    a2=[1 2 3;4 5 6];
    fid = fopen('myfile.txt', 'wt');
    for i=1:2
    fprintf(fid, '%s: \n', ['a',int2str(i)]); 
    b = eval(['a',int2str(i)]);
    fprintf(fid, [repmat('%d ', 1, size(b,2)), '\n'], b');
    end
    fclose(fid);

     

    https://www.cnblogs.com/pengwangguoyh/articles/3223072.html

    展开全文
  • 关于二进制文件与文本文件

    千次阅读 2017-03-16 21:59:03
    所谓的文本文件其实就是数据格式为字符型,用记事本就能打开的文件,它存储在计算机中以二进制的方式存储,当读出来的时候需要解码,仅仅按照单个字符来解码,用UTF-8还是unicode取决于用户设置的文本编码。...
  • 谈这个问题,我们首先看一下什么样的文件是文本文件,而什么样的文件又是二进制文件。 什么文件是文本文件呢?我们常见的txt, html, javascript, css, java,python等文件都是文本文件,他们都可以通过windows中的...
  • 超文本链接的解释链接从一个文本文档指向其它文本文档或从文本锚点***anchor***指向某已命名位置的链接***link***。超文本1965年TedNelson在计算机上处理文本文件时想了一种把文本中遇到的相关文本组织在一起的方法...
  • Matlab如何读取文本文件

    千次阅读 2016-09-29 00:00:02
    MATLAB对于文本文件(txt)进行数据读取的技巧总结(经典中的经典)由于本帖内容较多,部分转自他人的心得,因此,凡转贴的地方仅用“----转----”标注,原作者略去,在此对所有原作者表示感谢!  特别说明:由于...
  • 用于获取股票清单并创建包括其行业和行业的新文本文件的代码。 main()可以采用称为sort的参数。 默认情况下,它是关闭的,但是如果设置为true,它将生成相同的文本文件,除了它将由行业排序,而不是由股票行情...
  • python学习-结构化的文本文件

    千次阅读 2017-03-29 20:52:20
    结构化的文本文件 结构化的文本有很多格式,区别它们的方法如下: 分隔符, 比如tab(‘\t’)、逗号(‘,’)或竖线(‘|’)。 如:逗号分隔值(csv) ‘’标签, 如XML 和 HTML 标点符号, 如 JavaScript Object ...
  • 文件是在计算机内存中以二进制...文本文件(也称为ASCⅡ文件):它的每一个字节存放的是可表示为一个字符的ASCⅡ代码的文件,它是以“行”为基本结构的一种信息组织和存储方式的文件,可用任何文字处理程序阅读的简单文
  • 文本文件编码转换器

    千次阅读 2008-04-11 23:20:00
    文本文件也有编码?却实如此。什么是编码呢?编码是指不同国家的语言在计算机中的一种存储和解释规范,如,我们常说的ANSI是一种存储方式,ASCII是一种解释规范。最初,Internet上只有一种字符集——ANSI的ASCII字符...
  • matlab对于文本文件(txt)数据读取

    千次阅读 2015-09-23 15:49:42
    将文件看作是由一个一个字节(byte) 组成的, 那么文本文件中的每个字节的最高位都是0,也就是说文本文件使用了一个字节中的七位来表示所有的信息,而二进制文件则是将字节中的所有位都用上了。这就是 两者的区别;...
  • 文本处理

    千次阅读 2020-10-23 09:12:16
    所有类 Unix 的操作系统都非常依赖于用于几种数据类型存储的文本文件。所以这很有道理, 有许多用于处理文本的工具。在这一章中,我们将看一些用来“切割”文本的程序。在下一章中, 我们将查看更多的文本处理...
  • 文本文件从一种语言翻译成另一种语言,或从一种格式翻译成另一种。 当前支持以下文件格式: 文件格式 扩展名 .properties Windows资源文件 .resw, .resx (OSX plist) .plist .po, .pot .strings .yaml ...
  • 文本表示

    千次阅读 2015-11-18 14:45:27
    要使得计算机能高效的处理真实文本,就必须找到一种理想的形式化表示方法,这种表示一方面能真实的反映文档内容(主题、领域或结构等),另一方面也要有对不同文档的区分能力。   目前文本表示通常采用向量空间模型...
  • CSS 文本

    2017-12-09 22:04:38
    CSS 文本属性可定义文本的外观。 通过文本属性,您可以改变文本的颜色、字符间距,对齐文本,装饰文本,对文本进行缩进,等等。 缩进文本 把 Web 页面上的段落的第一行缩进,这是一种最常用的文本格式...
  • linux中重定向内容到文本文件

    千次阅读 2012-01-10 11:51:19
    echo 仅仅是输出到文件中  tee 除了输出到文件中,还得输出到控制台 AWK介绍 0.awk有3个不同版本: awk、nawk和gawk,未作特别...完整的awk脚本通常用来格式化文本文件中的信息。 2.三种方式调用awk 1
  • 将文件看作是由一个一个字节(byte) 组成的,那么文本文件中的每个字节的最高位都是0,也就是说文本文件使用了一个字节中的七位来表示所有的信息,而二进制文件则是将字节中的所有位都用上了。这就是两者的区别;接着...
  • 使用文本文件(.txt)进行数据存取的技巧总结由于本帖内容较多,部分转自他人的心得,因此,凡转贴的地方仅用“----转----”标注,原作者略去,在此对所有原作者表示感谢!特别说明:由于大家在 I/O 存取上以 txt 文件...
  • 这是用于生成用于训练对象检测神经网络的合成文本文档的工具。 它提供了命令行和Web界面。 该工具还可以YOLO或TFRecord格式导出数据(与Tensorflow一起使用)。 安装 可以通过运行以下命令来安装依赖关系。 $ pip ...
  • 特别说明:由于大家在 I/O 存取上以 txt 文件为主,且读取比存储更麻烦(存储的话 fwrite, fprintf 基本够用),因此下面的讨论主要集中在“txt 文件的读取”上。除了标注了“转”之外,其余心得均出于本人经验之...
  • 将文件看作是由一个一个字节(byte) 组成的, 那么文本文件中的每个字节的最高位都是0,也就是说文本文件使用了一个字节中的七位来表示所有的信息,而二进制文件则是将字节中的所有位都用上了。这就是两者的区别; ...
  • 文本分类

    千次阅读 2016-11-01 12:38:39
    文本分类: 预处理 特征选择 DF (Document Frequency) 信息增益 (Information Gain, IG) 熵 (Entropy) 相对熵 (Relative Entropy) χ² 统计量 (Chi-Square) 互信息 (Mutual Information) Robertson & Sparck Jones...
  • 使用文本文件(.txt)进行数据存取的技巧总结(相当的经典) 使用文本文件(.txt)进行数据存取的技巧总结 由于本帖内容较多,部分转自他人的心得,因此,凡转贴的地方仅用“----转----”标注,原作者略去,在此对...
  • 文本文件的读写(1)文本文件读取① 使用 read_table 来读取文本文件② 使用 read_csv 函数来读取 csv 文件③ read_table 和 read_csv 常用参数及其说明(2)文本文件存储① to_csv写入csv 文件② 参数说明(3)...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 178,150
精华内容 71,260
关键字:

以下什么被称为文本文件