精华内容
下载资源
问答
  • C语言读取文件中文本模式和二进制模式的区别

    千次阅读 多人点赞 2016-07-22 16:14:58
    二进制存储和文本存储完全不相同?对于纯文本必须使用文本模式?对于纯数字必须使用二进制模式?如果你对这些有疑惑,这篇文章适合你,如果你是来看函数时如何使用的,可能你要另寻他处了。 二、明白关键一点  任何...

    一、疑惑

      在学习C语言读取文件的时候,首先学习到的是C语言读取文件时分文本模式和二进制模式。给好多人造成疑惑,文件存储时要分类?二进制存储和文本存储完全不相同?对于纯文本必须使用文本模式?对于纯数字必须使用二进制模式?如果你对这些有疑惑,这篇文章适合你,如果你是来看函数时如何使用的,可能你要另寻他处了。

    二、明白关键一点

      任何数据在内存中或者硬盘上的存储都是1、0组成的序列,从硬盘、内存这个角度看根本不存在什么二进制和文本模式之分。

    三、区别

      稍对C语言操作文件有了解都知道2点:1、首先应该fopen打开文件2、有两类文件操作函数,对应着二进制模式和文本模式。

      两个模式的区别在两个地方,这两个地方的区别正好体现在刚才说的2点上。

      1、 打开文件时选择模式

        使用fopen函数时,要给予第二个参数一个值,告诉fopen使用什么模式打开文件。这里的参数决定的就是第一个区别:对于字符串中的\n如何处理?

         教材中说,文本模式中,在存储\n时要转化为\r\n,读取文件时进行逆转换。二进制模式时,则不进行转换。当然这是在操作系统是Windows的条件下。

        首先我们要知道回车和换行是不相同的,Windows中文字另起一行内存表示为<回车><换行>对应\r\n,而Linux、Unix中则是单单一个<换行>对应\n。Mac中则是一个<回车>对应\r

        C语言起源于Unix的产生,对于文件中的另起一行,Unix采用单个\n表示。所以我们通常在输出一个短话想换行时加一个\n就可以了,Windows也是如此。到了数据从内存到硬盘上进行存储时,对于unix来说,\n照样是\n。而Windows为了防止读取时混乱必须转换为\r\n。Mac呢,就是\r。

        这就是第一区别,这个区别是体现在fopen第二个参数,跟你使用文本模式的函数还是二进制模式的函数根本不相关!你可以做一个实验,使用二进制模式的函对于同样的字符串:”Hello\n”,当fopen使用w参数写入文件,无论是fwrite还是fprintf都会对\n会进行转换,而使用wb参数则都不进行转换。

      2、  两种不同模式的函数

        打开文件后,要进行数据写入。

        教材中说,使用文本模式打开文件,就要用fprintf写入数据,使用二进制模式打开文件,就要用fwrite写入数据。

        其实你用文本模式打开文件,一个字符串,fprintf、fwrite都能写入文件,写入还都是一样的数据。使用两类函数的区别其实在于数字的处理上。

        对于一个数字5,你用fprintf写入,将把数字5转换为字符5,将其对应的ASCII编码存入存储器,占用1个字节。但实际上数字5就是数字5,对应2进制101,整形占用4个字节。fwrite则将这个数字在内存中占用的4个字节全部原样写入到硬盘中,占4个字节。

        而同样对于一段字符串”Hello”,使用ASCII编码对于fprintf和fwrite都能原样写到硬盘中。

        同样对于这个区别,你仍然能做个实验,对于一个int型数字5,你如何用fprintf和fwrite写入到硬盘中,他们对应的十六进制码是多少?对于一段字符串你再用两个函数分别写到硬盘中,你看看对应的十六进制码是什么。这个实验跟你用fopen如何指定第二个参数无关。

    四、总结

      文本模式和二进制模式其实就2个简单的区别,抓住这两个核心完全能搞懂两种模式的不同。

      对于第一个区别完全是因为操作系统的差异导致,C作为一个跨平台的语言必须要设计一种方法解决这个跨平台的问题,如果3个平台对于另起一行这个操作统一是不存在这第一个区别的

      对于第二个区别,一切数据的存储都是二进制1、0存储,只不过对于数字,既可以认为是一个数字,也可以认为是一个字符,这就是产生第二个区别的原因

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

    千次阅读 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

    展开全文
  • 二进制模式打开一个文件的时候,文件本身的内容你编写程序时用函数读到的内容完全相同(或者说和磁盘上的内容完全相同)。 实际上, 所有的数据都是以二进制形式储存的, 甚至连字符都以字符码的二进制表示来...

    用二进制模式打开一个文件的时候,文件本身的内容和你编写程序时用函数读到的内容完全相同(或者说和磁盘上的内容完全相同)。

    实际上, 所有的数据都是以二进制形式储存的, 甚至连字符都以字符码的二进制表示来储存。 如果文件中的所有数据都被解释成字符码, 则称该文件包含文本数据。 如果部分或所有的数据都被解释成二进制形式的数值数据, 则称该文件包含二进制数据( 另外, 用数据表示机器语言指令的文件都是二进制文件) 。

    但是如果用了文本模式,那么操作系统在将文件内容传给上层程序(库函数,或者是你的程序)时,或者上层程序通过操作系统向文件写入内容时,操作系统都会预先进行一层预处理(或者说转义),具体过程依赖于操作系统的实现。在Windows+VC下,最常见就是将回车符"\r\n"(没有引号,且\作转义符用,下同)解释成"\n"(读出时),将"\n"解释成"\r\n"(写入时)。而在Linux下没有这层转换,这也是Windows和Linux文本文件不通用的原因。比如一个TXT文件在Windows下,"\r\n"就当作一个换行符读取,而在Linux下就当作一个回车加换行读取了。

    下面用两种方式打开一个文件“file.dat",内容为"ABC\r\nDEF":

    1.以文本方式打开并读取:

    fp = fopen("file.dat","r");
    while(fgetc(fp)!=EOF);
    
    得到的内容为:ABC\nDEF

    2.以二进制方式打开并读取:

    fp = fopen("file.dat","rb");
    while(fgetc(fp)!=EOF);
    
    得到的内容为:ABC\r\nDEF

    可以看到两种打开方式,得到的内容不一致。

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

    二进制读写是将内存里面的数据直接读写入文本中;而文本呢,则是先将数据转换成字符串,再写入到文本中。

    下面用一个例子说明二者的差别:

    #define _CRT_SECURE_NO_WARNINGS
    #define SIZE 21
    #include <stdio.h>
    void write_to_binary_file();
    void write_to_text_file();
    void read_from_binary_file();
    void read_from_text_file();
    
    struct Student {
      int num;
      char name[SIZE];
      float score;
    };
    
    //使用二进制写入
    void write_to_binary_file() {
      struct Student stdu;
      stdu.num = 111;
      sprintf_s(stdu.name, SIZE, "%s", "shine");
      stdu.score = 80.0f;
      FILE *fp = fopen("test_b.dat", "a+b");
      fwrite(&stdu, sizeof(struct Student), 1, fp);
      fclose(fp);
    }
    
    //文本格式写入
    void write_to_text_file() {
      struct Student stdu;
      stdu.num = 111;
      sprintf_s(stdu.name, SIZE, "%s", "shine");
      stdu.score = 80.0f;
      FILE *fp = fopen("test_t.dat", "a+");
      fprintf(fp, "%d%s%f", stdu.num, stdu.name, stdu.score); //将数据转换成字符串(格式可自己定义)
      fclose(fp);
    }
    
    //从二进制读取
    void read_from_binary_file() {
      FILE *fp = fopen("test_b.dat", "a+b");
      struct Student stdu;
      fread(&stdu, sizeof(struct Student), 1, fp);  //注:结构体方式写入就结构体方式读出
      printf("binaryContent=%d%s%f", stdu.num, stdu.name, stdu.score);
      fclose(fp);
    }
    
    //从文本读取
    void read_from_text_file() {
      char ch;
      FILE *fp = fopen("test_t.dat", "a+");
      printf("textContent=");
      while ((ch = getc(fp)) != EOF) {
        putchar(ch);
      }
    }
    
    int main() {
      write_to_binary_file();
      write_to_text_file();
    
      read_from_binary_file();
      printf("\n");
      read_from_text_file();
      return 0;
    }
    binaryContent=111shine80.000000
    textContent=111shine80.000000

    运行程序后在可执行文件目录下生成两个文件test_b.dat和test_t.dat:

    分别用二进制器和文本编辑器打开看看:

    test_t.dat:

    test_b.dat:

    对于二进制模式int num=111,刚好等于16进制的6F,1个字节(因为111<127也可推出1个字节);而对于文本模式111就变成字符串"111"了,就是3个'1'(0x31表示),在文本文件中写成31,31,31用了3个字节(因为"111"是三个字符表示也可推出3个字节)。二者前面中间有一段相同的16进制编码7368696E65,对应的就是shine。而最后的是一个浮点类型,对于文本模式,80.000000直接对应ASCII码的38302E303030303030,而二进制模式是按国际标准IEEE 754表示浮点数的(详见:关于整数与浮点数二进制表示),保证精度。

    test_t.dat是以文本数据数据存储的,可以看到每个数据都被表示成了字符码。 而test_b.dat是以二进制数据存储的,可以看到每个数据都被表示成了二进制形式的数值数据,真实还原了结构体成员变量{int num; char name[SIZE]; float score;}的数据类型值,int num=111=0x6F,char name=0x7368696E65(本就是字符串这和文本模式下是一致的),float score=80.000000F。

    文本模式下,由于每个数据都表示成1个字符码,而1个字符占用1个字节,所以字符串的长度就是占用的字节数,很浪费空间。二进制模式下,int、long、float、double这样的类型,分别也就占4、4、4、8字节(32位系统下),可成倍减少占用的空间,并且可以精确还原成相应的类型值。

    下图很直观展示了两种模式下的存取区别:

    例如:double num = 1./3.; fprintf(fp,"%f", num); 把num储存为8个字符: 0.333333。 使用%.2f转换说明将其储存为4个字符:0.33,用%.12f转换说明则将其储存为 14 个字符:0.333333333333。改变转换说明将改变储存该值所需的空间数量,也会导致储存不同的值。把num 储存为 0.33 后,读取文件时就无法将其恢复为更高的精度。一般而言,fprintf()把数值转换为字符数据,这种转换可能会改变值。
    为保证数值在储存前后一致,最精确的做法是使用与计算机相同的位组合来储存。因此,double 类型的值应该储存在一个 double 大小的单元中。如果以程序所用的表示法把数据储存在文件中,则称以二进制形式储存数据。不存在从数值形式到字符串的转换过程。对于标准 I/O,fread()和 fwrite函数用于以二进制形式处理数据。

    二进制和文本的用法很容易混淆。 ANSI C和许多操作系统都识别两种文件格式: 二进制和文本。 能以二进制数据或文本数据形式存储或读取信息。 可以用二进制模式打开文本格式的文件, 可以把文本储存在二进制形式的文件中。 可以调用 getc()拷贝包含二进制数据的文件。 然而, 一般而言,用二进制模式在二进制格式文件中储存二进制数据。 类似地, 最常用的还是以文本格式打开文本文件中的文本数据( 通常文字处理器生成的文件都是二进制文件, 因为这些文件中包含了大量非文本信息, 如字体和格式等)。

     
    展开全文
  • 当对象需要持久化到硬盘或者网络传输的时候,我们需要进行序列化(也就是保存内存中的对象的状态)序列化就是将内存中的对象流化,方便我们进行写入读取为什么要序列化,因为在对象中可能会保存有指针,或者是其他...

    当对象需要持久化到硬盘或者网络传输的时候,我们需要进行序列化(也就是保存内存中的对象的状态)

    序列化就是将内存中的对象流化,方便我们进行写入读取

    为什么要序列化,因为在对象中可能会保存有指针,或者是其他对象的引用。如果我们不加处理,将指针保存,这是没有意义的,因为反序列化的时候是重新分配内存的。如果有其他的对象的引用,我们不能为每个对象都保留一份副本。另外需要网络传输的时候,序列化也要考虑统一字节序以及数据对齐带来的差异。

    序列化的手段(摘自网上)

    以下序列化机制的解决方案:
    1.保存到磁盘的所有对象都获得一个序列号(1, 2, 3等等)

    2.当要保存一个对象时,先检查该对象是否被保存了

    3.如果以前保存过,只需写入"与已经保存的具有序列号x的对象相同"的标记,否则,保存该对象

    通过以上的步骤序列化机制解决了对象引用的问题!

    json xml 以及 bson protobuf 是常用的序列化手段,前面两个是基于文本的,后面两个是基于二进制的。无论是文本格式还是二进制格式,存储的都是二进制。例如

    struct A{
        int a;
        int b;
    }s(1,2);

    json序列化的结果是:'{a:1,b:2} '是根据字符编码序列化为文本形式。而bson则是内存中的数据按其在内存中的存储形式原样取出即可。

    这两个各有好处,文本格式是通用简单,可扩展性强,所谓可扩展性强也就是可以增加数据结构中的字段并且向后兼容。还拿上面的结构体举列子。比如struct{int a;int b;}s={1,2};,序列化成Json就变成:{a:1,b:2},可以再添加一个字段c,变成{a:1,b:2,c:3}而不影响老版本的程序,它们可以忽略字段c。文本格式的缺点是占用内存多,效率低下。而这两点在二进制中有了好的改变,但是二进制实现是比较麻烦的。我们更多用的是自己设计的格式。

    http协议是基于文本格式的,指的是协议的指令、状态是文本格式的,但是传输的东西可以是文本也可以是二进制。

    展开全文
  • 文本格式和二进制格式的区别

    千次阅读 2012-09-25 17:43:51
    关于二进制文件和文本文件,他们之间到底有什么不同呢?在这篇文章里,我用自己的方式来解读!不对之处,望各位牛人多指点,或联系我jiadongkai@gmail.com.  我们都知道,在机器层面,所有的信息都是0/1,所有的...
  • C/C++读取文件操作包括二进制和文本文件。
  • JavaScript-二进制二进制数组

    万次阅读 2016-07-03 18:09:40
    在ES5中引入了Blob用于处理二进制。在ES6中引入了ArrayBuffer、TypedArray、DataView用于处理二进制数组。常规的前端操作用,用到二进制的地方不多。但是,当我想处理文件的传输时候,使用二进制进行传输可以更快。...
  • fwritefprintf C语言把文件看作一个字符(字节)的序列,即由一个一个字符...二进制文件是把内存中的数据按其在内在中的存储形式原样输出到磁盘上存放。 fprintf(fp, "%d", buffer); 是将格式化的数据...
  • Python和二进制(1)

    千次阅读 2016-07-26 09:54:37
    二进制文件和文本文件的区别 解释1: 这里谈谈文本文件与二进制文件以及C语言读写这两种文件的标准接口。 【具体到物理保存时都是二进制的,关键是保存前对数据的编码有区别。】 文本文件与二进制文件在计算机文件...
  • C语言

    万次阅读 多人点赞 2019-12-18 23:01:50
    则认为该常量是longint 型常量 69.C语言实型常量可用二进制小数指数二种形式表示 70.C语言实型变量分为:float型、double型、long double型三类 71.C语言doule型一个变量的数值有效数字是16位 72.C语言的字符常量是...
  • 二进制文件,这个再基础不过的名词,正因为它的无处不在,或许没有人会关注它背后隐含的内容。其实我也一样,在写下 这些文字之前,我也是认为二进制文件就像空气一样,平常得让人完全忽略了。  ...
  • 入门学习Linux常用必会60个命令实例详解doc/txt

    千次下载 热门讨论 2011-06-09 00:08:45
    -v:显示信息,通常-f用来除错。 -a:将/etc/fstab中定义的所有文件系统挂上。 -F:这个命令通常-a一起使用,它会为每一个mount的动作产生一个行程负责执行。在系统需要挂上大量NFS文件系统时可以加快...
  • 前端面试题(持续更新中)

    万次阅读 多人点赞 2019-11-06 17:16:33
    闭包的缺点:滥用闭包函数会造成内存泄露,因为闭包中引用到的包裹函数中定义的变量都 永远不会被释放,所以我们应该在必要的时候,及时释放这个闭包函数本 2.数据类型 基本数据类型:String,Boolean,number,Null,...
  • MySQL 面试题

    万次阅读 多人点赞 2019-09-02 16:03:33
    因为 MySQL 还会有部分内容运维相关度比较高,所以本文我们分成两部分【开发】【运维】两部分。 对于【开发】部分,我们需要掌握。 对于【运维】部分,更多考验开发的知识储备情况,当然能回答出来是比较好的...
  • Linux总结

    千次阅读 多人点赞 2020-01-14 20:36:45
    、初探Linux 2.1 Linux简介 2.2 Linux诞生简介 2.3 Linux的分类 三 、Linux文件系统概览 3.1 Linux文件系统简介 3.2 文件类型与目录结构 四 、Linux基本命令 4.1 目录切换命令 4.2 目录的操作命令(增删改...
  • TensorFlow入门

    千次阅读 多人点赞 2019-04-23 10:09:29
    所以我们在实际编程时,一定注意参与运算的张量数据类型要相同。 变量 变量Variables维护图执行过程中的状态信息. 下面的例子演示了如何使用变量实现一个简单的计数器. # 创建一个变量, 初始化为标量 0. ...
  • js面试题

    千次阅读 多人点赞 2019-04-09 19:42:32
    JavaScript 的组成 JavaScript 由以下三部分...BOM(浏览器对象模型):提供了浏览器窗口之间进行交互的对象方法 JS 的基本数据类型引用数据类型 基本数据类型:undefined、null、boolean、number、string、s...
  • 测试开发笔记

    万次阅读 多人点赞 2019-11-14 17:11:58
    章 测试过程 8 1.测试模型 8 H模型: 8 V模型 9 2.内部测试 10 3外部测试: 10 验收测试:(在系统测试之后) 11 回归测试: 11 4.测试过程(干什么,怎么干) 12 5.各阶段输入、输出标准以及入口、出口准则:...
  • adb命令大全

    千次阅读 多人点赞 2019-06-03 22:19:07
    三、ADB命令语法单一设备/模拟器连接多个设备/模拟器连接四、ADB常用命令4.1 基本命令4.1.1 查看adb的版本信息4.1.2 启动adb4.1.3 停止adb4.1.4 以 root 权限运行 adbd4.1.5 指定 adb server 的网络端口4.1.5 查询已...
  • 数据库面试

    千次阅读 多人点赞 2019-02-13 09:03:42
    答:视图是对一些原表选择部分列合并成的一个虚拟表格,具有物理表相同的功能。可以对视图进行插入、更新、删除操作。对视图的修改会同步到具体数据表中。注意以下几种情况不能对视图进行插入、更新、删除的操作...
  • Caffe简介

    千次阅读 多人点赞 2018-08-19 16:15:54
     caffe是一个清晰而高效的深度学习框架,是纯粹的C++/CUDA架构,支持命令行、pythonmatlab接口;可以在CPUGPU之间无缝切换,其作者是贾扬清,目前caffe2已经发布。  caffe的全称是Con...
  • 【数据库学习】数据库总结

    万次阅读 多人点赞 2018-07-26 13:26:41
    如:(X1,X2)→X3,X2→X3 其中x3对x2部分依赖 如:(X1,X2)→X3,X2→X4 其中有非主属性X4部分依赖于候选键{X1,X2},所以这个关系模式不为第范式;又因为范式之间的关系满足1NF⊇2NF⊇3NF ⊇ BCNF,所以是第...
  • 二进制文件及其顺序读写

    千次阅读 2017-06-13 14:08:05
    short int在内存中需要两个字节,而这两个字节就是它的二进制存储形式。 比如short int x=12345; 那么ASCII存储为:00110001 00110010 00110011 00110100 00110101 二进制形式存储为:00110000 00111001,二进制存储...
  • C#基础教程-c#实例教程,适合初学者

    万次阅读 多人点赞 2016-08-22 11:13:24
    本章介绍C#语言的基础知识,希望具有C语言的读者能够基本掌握C#语言,并以此为基础,能够进一步学习用C#语言编写window应用程序Web应用程序。当然仅靠一章的内容就完全掌握C#语言是不可能的,如需进一步学习C#语言...
  • 哈希算法

    千次阅读 2019-11-07 15:39:56
    任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法,而通过原始数据映射之后得到的二进制值串就是哈希值。 2).设计哈希算法满足的几点要求: 从哈希值不能反向推导出原始数据(所以哈希...
  • 机器语言:(二进制语言)是用二进制代码表示的计算机语言。能直接识别执行的一种机器指令的集合。不同机器的机器语言不同。机器语言具有灵活、直接执行速度快等特点。 (如: 10100010010111100011代表的是A=B...
  • Python入门

    千次阅读 多人点赞 2017-12-13 15:05:02
    Python入门目录1.Python基本数据类型 2.Python的print语句 3.Python的注释 4.Python的变量 5.Python中raw字符串与多行字符串 6.Python当中的Unicode字符串 7.Python中的整数浮点数...11.Python中的条件判断
  • Threejs 拓展之二进制数组

    千次阅读 2017-12-12 16:43:47
    在Threejs 的学习过程中,分配缓存区域时需要调用JavaScript中的Uint16Array、Float32Array等对象来分配连续的内存空间。...二进制数组 详细的介绍了上面的几个对象。 二进制数组 二进制数组(ArrayBuffer
  • 循环解析出一个二进制索引文件中的内容,只要知道存储的数据结构就可以解析出来,例如: import struct fd=file(u"h:/xxxx.index",'rb') while fd:  buf=fd.read(20)  if len(buf) == 0:  break;  print ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 46,093
精华内容 18,437
关键字:

文本和二进制占用内存相同信息