-
二进制文件转文本文件_Python文件
2020-12-14 12:28:47目标文件的概念文件的...文件的作用将数据长期保存下来,在需要的时候使用文件的存储方式在计算机中,文件是以 二进制 的方式保存在磁盘上的文本文件和二进制文件文本文件可以使用 文本编辑软件 查看本质上还是二...目标
- 文件的概念
- 文件的基本操作
- 文件/文件夹的常用操作
- 文本文件的编码方式
01. 文件的概念
1.1 文件的概念和作用
- 计算机的 文件,就是存储在某种 长期储存设备 上的一段 数据
- 长期存储设备包括:硬盘、U 盘、移动硬盘、光盘...
文件的作用
将数据长期保存下来,在需要的时候使用
文件的存储方式
- 在计算机中,文件是以 二进制 的方式保存在磁盘上的
文本文件和二进制文件
- 文本文件
- 可以使用 文本编辑软件 查看
- 本质上还是二进制文件
- 例如:python 的源程序
- 二进制文件
- 保存的内容 不是给人直接阅读的,而是 提供给其他软件使用的
- 例如:图片文件、音频文件、视频文件等等
- 二进制文件不能使用 文本编辑软件 查看
02. 文件的基本操作
2.1 操作文件的套路
在 计算机 中要操作文件的套路非常固定,一共包含三个步骤:
- 打开文件
- 读、写文件
- 读 将文件内容读入内存
- 写 将内存内容写入文件
- 关闭文件
2.2 操作文件的函数/方法
- 在 Python 中要操作文件需要记住 1 个函数和 3 个方法
序号函数/方法说明01open打开文件,并且返回文件操作对象02read将文件内容读取到内存03write将指定内容写入文件04close关闭文件
- open 函数负责打开文件,并且返回文件对象
- read/write/close 三个方法都需要通过 文件对象 来调用
2.3 read 方法 —— 读取文件
- open 函数的第一个参数是要打开的文件名(文件名区分大小写)
- 如果文件 存在,返回 文件操作对象
- 如果文件 不存在,会 抛出异常
- read 方法可以一次性 读入 并 返回 文件的 所有内容
- close 方法负责 关闭文件
- 如果 忘记关闭文件,会造成系统资源消耗,而且会影响到后续对文件的访问
- 注意:read 方法执行后,会把 文件指针 移动到 文件的末尾
# 1. 打开 - 文件名需要注意大小写file = open("README")# 2. 读取text = file.read()print(text)# 3. 关闭file.close()
提示
- 在开发中,通常会先编写 打开 和 关闭 的代码,再编写中间针对文件的 读/写 操作!
文件指针(知道)
- 文件指针 标记 从哪个位置开始读取数据
- 第一次打开 文件时,通常 文件指针会指向文件的开始位置
- 当执行了 read 方法后,文件指针 会移动到 读取内容的末尾
- 默认情况下会移动到 文件末尾
思考
- 如果执行了一次 read 方法,读取了所有内容,那么再次调用 read 方法,还能够获得到内容吗?
答案
- 不能
- 第一次读取之后,文件指针移动到了文件末尾,再次调用不会读取到任何的内容
2.4 打开文件的方式
- open 函数默认以 只读方式 打开文件,并且返回文件对象
语法如下:
f = open("文件名
-
C/C++文件读写操作(二进制文件&文本文件)
2020-10-05 18:44:15C/C++读取文件操作包括二进制和文本文件。1. C++文件读写操作
包含的头文件是
fstream
,ifstream
是文件输入流,ofstream
是文件输出流。
打开文件方式为ofstream fout(file_name, ios::out|...|...)
或者ofstream fout; fout.open(file_name, ios::out|...|...)
。打开模式 说明 ios::in 为输入打开文件;文件不存在则打开失败,文件存在则打开。(ifstream默认打开方式) ios:out 为输出打开文件;文件不存在则创建打开,文件存在则清空。(ofstream默认打开方式) ios::nocreate 文件存在的时候不起作用,文件不存在的时候,强制文件不存在也不创建,此项针对输出文件打开。 ios::noreplace 不覆盖文件,若打开文件时如果文件存在则失败。文件不存在时,参数无效。文件存在时,此选项对ios::in无效,但是对于ios::out有效,当文件存在时打开失败。 ios::binary 文件默认是以文本形式打开的,此模式为二进制模式打开。 ios::trunc 若文件不存在,则无效,若文件存在首先清空里面的内容。 ios::app 所有的输出附加在文件末尾,读操作与写操作共享指针,具有读文件的特性,与ios::out组合使用的时候不清空文件内容。 ios::ate 文件指针的初始位置在文件尾。 1.1 C++操作文本文件
1.1.1 写文件
#include <iostream> #include <fstream> using namespace std; int main() { ofstream fout("out.txt",ios::out); //默认是ios::trunc /*读文件*/ if(!fout.is_open()) { exit(1); } char ch; while(!(EOF == (ch =getchar()))) //ctrl + z { fout << ch; } fout.close(); return 0; }
1.1.2 读文件
#include <iostream> #include <fstream> #include <string> using namespace std; int main() { ifstream fin("in.txt",ios::in);//默认是ios::trunc /*读文件*/ if(!fin.is_open()) { exit(1); } char ch; fin >> noskipws; //不跳过空格和回车 //默认跳过空格和回车 //读取单个字符 /*while(!fin.eof()) { fin >> ch; cout << ch; }*/ //读取单个字符 /*while(!(EOF == (ch = fin.get()))) { cout << ch; }*/ //读取一行字符串 getline string str; while(getline(fin, str)) { cout << str <<"*"<<endl; } fin.close(); return 0; }
1.2 C++操作二进制文件
二进制文件比文本文件的好处是占用内存空间小,且便于检索。比如要存放结构体或者类时,文本文件存储的只是单纯的文本,不但浪费空间而且效率低下。因为在结构体或者类中每个对象的占用字节数不同,即使文本文件按照某个值排好序,只能从文件头向文件尾搜索,没有什么其他好办法。
但是用二进制来存储,每个结构体或者类占用的字节数都是相同的,直接将该对象写入文件,称作“记录”,每个对象对应一条记录,按照某个值排序之后可以用比如二分搜索等算法进行检索,这样就快了很多。
读写二进制文件不能用类似于cin cout
之类的流数据读取方法,这时需要调用fstream
和ofstream
的成员函数write
向文件中写入数据,fstream
和ifstream
的成员函数read
从文件中读取数据。1.2.1 写文件
ostream & write(char* buffer, int count);
#include <iostream> #include <fstream> #include <string> using namespace std; class MyClass{ public: int a; char b[10]; char c; }; int main() { ofstream fout("out.dat",ios::out | ios::binary); if(!fout.is_open()) exit(1); MyClass mc; while(cin >> mc.a >> mc.b >> mc.c) { fout.write((char*)&mc, sizeof(mc));//mc的地址就是要写入内存文件缓冲区的地址 } fout.close(); return 0; }
1.2.2 读文件
istream & read(char* buffer, int count);
int gcount();
#include <iostream> #include <fstream> #include <string> using namespace std; class MyClass{ public: int a; char b[10]; char c; }; int main() { ifstream fin("out.dat",ios::in | ios::binary); if(!fin.is_open()) exit(1); MyClass mc; while(fin.read((char*)&mc, sizeof(mc))) { int cnt_bytes = fin.gcount();//查看刚才读取了多少字节 cout << cnt_bytes<<endl; cout << mc.a << " "<<mc.b << " "<< mc.c<<endl; } fin.close(); return 0; }
为什么在MyClass中b定义为string类型的变量,在读取out.dat文件的时候读不出来呢?
2. C文件读写操作
打开模式 说明 r 以只读方式打开文件,该文件必须存在。 r+ 以可读写方式打开文件,该文件必须存在。 rb+ 读写打开一个二进制文件,允许读写数据。 rw+ 读写打开一个文本文件,允许读和写。 w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。 w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。 a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留) a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 (原来的EOF符不保留) wb 只写打开或新建一个二进制文件;只允许写数据。 wb+ 读写打开或建立一个二进制文件,允许读和写。 ab+ 读写打开一个二进制文件,允许读或在文件末追加数据。 at+ 打开一个叫string的文件,a表示append,就是说写入处理的时候是接着原来文件已有内容写入,不是从头写入覆盖掉,t表示打开文件的类型是文本文件,+号表示对文件既可以读也可以写。 2.1 C操作文本文件
2.1.1 写文件
#include<stdio.h> #include<stdlib.h> int main() { FILE *fp = fopen("out.txt", "w");//只写方式打开文件 if(!fp) exit(1);//写文件失败 int a; while(scanf("%d", &a)) { fprintf(fp, "%d ",a); } fclose(fp); return 0; }
2.1.2 读文件
#include<stdio.h> #include<stdlib.h> #include<string.h> int main() { FILE* fp = fopen("in.txt", "r");//只读方式打开文件 if (!fp) exit(1);//读文件失败 int mode = 1; printf("mode为1, 按字符读入并输出; mode为2, 按行读入并输出;\n请输入mode: "); scanf("%d", &mode); if (mode == 1) { //按字符读入并直接输出 char ch;//读取的字符 /*while (EOF != (ch = fgetc(fp)))//是否为文件结束符 printf("%c", ch);*/ while(EOF != fscanf(fp, "%c", &ch)) printf("%c", ch); } else if (mode == 2)//按行读入并输出 { char line[100]; memset(line, 0, 100); while (!feof(fp)) { fgets(line, 100, fp); printf("%s", line); //输出 } } fclose(fp); return 0; }
2.2 C操作二进制文件
2.2.1 写文件
此处要注意的就是在写结构体数据的时候,因为
char c
变量是字符,因此要注意要在每次输入结构体之后吃掉回车符,否则会导致输入失败,就像我在代码中写的那样,用空格来吃掉前面的空白字符(包括回车 空格等)。#include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct MyStruct{ int a; char b[10]; char c; }MyStruct; int main() { FILE* fp = fopen("test.dat", "wb+");//读写打开或建立一个二进制文件,允许读和写。 if (!fp) exit(1);//写文件失败 /*写int数据*/ /*int a; while(scanf("%d", &a)) fwrite(&a, sizeof(int), 1, fp);//写入int数据*/ /*写结构体数据*/ MyStruct ms; //先将结构体存储在结构体数组中 //MyStruct ms[4]; //MyStruct *p = ms; /*for(int i = 0; i < 4; i++,p++) { scanf(" %d", &p->a); scanf(" %s", p->b); scanf(" %c",&p->c); }*/ //fwrite(ms, sizeof(MyStruct), 4, fp); //最后写到二进制文件 //直接输入 以ctrl+D 结束输入 while(scanf(" %d %s %c ", &ms.a, ms.b, &ms.c)) //while(scanf(" %d", &ms.a) && scanf(" %s ", ms.b) && scanf(" %c ",&ms.c)) { //每次输入结束之后直接写入二进制文件 fwrite(&ms, sizeof(MyStruct), 1, fp); } fclose(fp); return 0; }
2.2.2 读文件
需要获取文件大小,否则只能自己主观设定数据长度。并不想C++读取二进制文件那样通过是否读到EOF来确定读取是否结束。
#include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct MyStruct{ int a; char b[10]; char c; }MyStruct; int main() { fp = fopen("test.dat", "rb+");//读写打开一个二进制文件,允许读写数据。 if (!fp) exit(1);//写文件失败 fseek(fp, 0L, SEEK_END);//定位到文件尾 int len = ftell(fp); //获取到文件大小 字节数 rewind(fp);//文件指针复位 到文件头 /*读int数据*/ /*int buffer[100]; memset(buffer, 0, sizeof(buffer)); //数组初始化为0 fread(buffer, sizeof(int), 100, fp);//读取数据到buffer缓冲区中 //读取的时候只能都读出来 或者一次读一个数据 但还是需要知道数据总长度 for(int i = 0; i < len / sizeof(int); i++) printf("%d ", buffer[i]); printf("\n"); int j = 0; while(j < len/sizeof(int)) { fread(&buffer[j], sizeof(int), 1, fp); printf("%d \n",buffer[j]); j++; }*/ /*读结构体数据*/ int j = 0; MyStruct ms[100]; while( j < len /sizeof(MyStruct)) { fread(&ms[j], sizeof(MyStruct), 1, fp); printf("%d %s %c\n", ms[j].a, ms[j].b, ms[j].c); j++; } fclose(fp); return 0; }
-
文本文件和二进制文件的差异和区别
2018-05-16 11:11:20广义上的二进制文件包括文本文件,这里讨论的是狭义上的二进制文件与文本文件的比较: 能存储的数据类型不同 文本文件只能存储char型字符变量。二进制文件可以存储char/int/short/long/float/……各种变量值。 每...广义上的二进制文件包括文本文件,这里讨论的是狭义上的二进制文件与文本文件的比较:
- 能存储的数据类型不同
文本文件只能存储char型字符变量。二进制文件可以存储char/int/short/long/float/……各种变量值。 - 每条数据的长度
文本文件每条数据通常是固定长度的。以ASCII为例,每条数据(每个字符)都是1个字节。进制文件每条数据不固定。如short占两个字节,int占四个字节,float占8个字节…… - 读取的软件不同
文本文件编辑器就可以读写。比如记事本、NotePad++、Vim等。二进制文件需要特别的解码器。比如bmp文件需要图像查看器,rmvb需要播放器…… - 操作系统对换行符(‘\n’)的处理不同(不重要)
文本文件,操作系统会对’\n’进行一些隐式变换,因此文本文件直接跨平台使用会出问题。
在Windows下,写入’\n’时,操作系统会隐式的将’\n’转换为”\r\n”,再写入到文件中;读的时候,会把“\r\n”隐式转化为’\n’,再读到变量中。
在Linux下,写入’\n’时,操作系统不做隐式变换。
二进制文件,操作系统不会对’\n’进行隐式变换,很多二进制文件(如电影、图片等)可以跨平台使用。
从存储方式来说,文件在磁盘上的存储方式都是二进制形式,所以,文本文件其实也应该算二进制文件。先从他们的区别来说,虽然都是二进制文件,但是二进制代表的意思不一样。打个比方,一个人,我们可以叫他的大名,可以叫他的小名,但其实都是代表这个人。二进制读写是将内存里面的数据直接读写入文本中,而文本呢,则是将数据先转换成了字符串,再写入到文本中。
要弄明白二者的区别,需要知道文件的读写过程。以读文件为例,
实际上是磁盘 》》 文件缓冲区》》应用程序内存空间这两个转化过程。我们说“文本文件和二进制文件没有区别”,实际上针对的是第一个过程;既然没有区别,那么打开方式不同,为何显示内容就不同呢?这个区别实际上是第二个过程造成的。
文件实际上包括两部分,控制信息和内容信息。纯文本文件仅仅是没有控制格式信息罢了;
实际上也是一种特殊的二进制文件。所以,我们很难区分二者的不同,因为他们的概念上不是完全互斥的。我们说文本文件是特殊的二进制文件,是因为文本文件实际上的解释格式已经确定了:ASCII或者unicode编码。文本文件的一个缺点是,它的熵往往较低,也就是说,其实本可以用更小的存储空间记录这些信息。比如,文本文件中的一个数字65536,需要用5个字节来存储;但是用二进制格式,采用int存储,仅仅需要2个字节。而二进制文件elf和bmp等,都往往有一个head,告诉你文件信息和解释方式。
记事本支持文本文件而不支持二进制文件,所以如果你用记事本打开文本文件那么一切正常,如果打开的是二进制文件就会出现乱码。但也有不乱码的地方,你会注意到那些地方都是字符编码的,而对于int、double等类型所对应的值都是乱码的,这是由于记事本只能够识别字符类型,而无法识别其他类型。
1、二进制文件是把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放,也就是说存放的是数据的原形式。
2、文本文件是把数据的终端形式的二进制数据输出到磁盘上存放,也就是说存放的是数据的终端形式。
字符数据本身在内存中就经过了编码,所以无论是二进制还是文本形式都是一样的,而对于非字符数据来说,例如inti=10;如果用二进制来进行存储的话为1010,但是如果需要用文本形式来进行存储的话就必须进行格式化编码(对1和0分别编码,即形式为‘1’和‘0’分别对应的码值)。
一、文本文件与二进制文件的定义大家都知道计算机的存储在物理上是二进制的,所以文本文件与二进制文件的区别并不是物理上的,而是逻辑上的。这两者只是在编码层次上有差异。简单来说,文本文件是基于字符编码的文件,常见的编码有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操作系统中并不需要,当然,当在两个不同的操作系统上共享文件时,这种存储转换又可能出来。
文本文件是一种计算机文件,它是一种典型的顺序文件,其文件的逻辑结构又属于流式文件。特别的是,文本文件是指以ASCII码方式(也称文本方式)存储的文件,更确切地说,英文、数字等字符存储的是ASCII码,而汉字存储的是机内码。文本文件中除了存储文件有效字符信息(包括能用ASCII码字符表示的回车、换行等信息)外,不能存储其他任何信息。
文本文件是一种由若干行字符构成的计算机文件。文本文件存在于计算机文件系统中。通常,通过在文本文件最后一行后放置文件结束标志来指明文件的结束。文本文件是指一种容器,而纯文本是指一种内容。文本文件可以包含纯文本。一般来说,计算机文件可以分为两类:文本文件和二进制文件。
只含有ASCII字符的文本文件可以在Unix、Macintosh、Microsoft Windows、DOS和其它操作系统之间自由交互,而其它格式的文件是很难做到这一点的。但是,在这些操作系统中,换行符并不相同,处理非ASCII字符的方式也不一致。
.txt是包含极少格式信息的文字文件的扩展名。.txt格式并没有明确的定义,它通常是指那些能够被系统终端或者简单的文本编辑器接受的格式。任何能读取文字的程序都能读取带有.txt扩展名的文件,因此,通常认为这种文件是通用的、跨平台的。
在英文文本文件中,ASCII字符集是最为常见的格式,而且在许多场合,它也是默认的格式。对于带重音符号的和其它的非ASCII字符,必须选择一种字符编码。在很多系统中,字符编码是由计算机的区域设置决定的。常见的字符编码包括支持许多欧洲语言的ISO 8859-1。
由于许多编码只能表达有限的字符,通常它们只能用于表达几种语言。Unicode制定了一种试图能够表达所有已知语言的标准,Unicode字符集非常大,它囊括了大多数已知的字符集。Unicode有多种字符编码,其中最常见的是UTF-8,这种编码能够向后兼容ASCII,相同内容的的ASCII文本文件和UTF-8文本文件完全一致。
微软的MS-DOS和Windows采用了相同的文本文件格式,它们都使用CR和LF两个字符作为换行符,这两个字符对应的ASCII码分别为13和10。通常,最后一行文本并不以换行符(CR-LF标志)结尾,包括记事本在内的很多文本编辑器也不在文件的最后添加换行符。
大多数Windows文本文件使用ANSI、OEM或者Unicode编码。Windows所指的ANSI编码通常是1字节的ISO-8859编码,不过对于像中文、日文、朝鲜文这样的环境,需要使用2字节字符集。在过渡至Unicode前,Windows一直用ANSI作为系统默认的编码。而OEM编码,也是通常所说的MS-DOS代码页,是IBM为早期IBM个人电脑的文本模式显示系统定义的。在全屏的MS-DOS程序中同时使用了图形的和按行绘制的字符。新版本的Windows可以使用UTF-16LE和UTF-8之类的Unicode编码。
由于结构简单,文本文件被广泛用于记录信息。它能够避免其它文件格式遇到的一些问题。此外,当文本文件中的部分信息出现错误时,往往能够比较容易的从错误中恢复出来,并继续处理其余的内容。文本文件的一个缺点是,它的熵往往较低,也就是说,可以用较小的存储空间记录这些信息。
文本文件基本上是定长编码的(也有非定长的编码如UTF-8),基于字符,每个字符在具体编码中是固定的,ASCII码是8个比特的编码,UNICODE一般占16个比特。而二进制文件可看成是变长编码的,因为是值编码,多少个比特代表一个值,完全由自己决定。
广义的二进制文件即指文件,由文件在外部设备的存放形式为二进制而得名。狭义的二进制文件即除文本文件以外的文件。
每个字符由一个或多个字节组成,每个字节都是用的-128—127之间的部分数值来表示的,也就是说,-128——127之间还有一些数据没有对应任何字符的任何字节。如果一个文件中的每个字节的内容都是可以表示成字符的数据,我们就可以称这个文件为文本文件。文本文件只是二进制文件中的一种特例,为了与文本文件相区别,人们又把除了文本文件以外的文件称为二进制文件,由于很难严格区分文本文件和二进制文件的概念,所以我们可以简单地认为,如果一个文件专门用于存储文本字符的数据,没有包含字符以外的其他数据,我们就称之为文本文件,除此之外的文件就是二进制文件。
为什么要使用二进制文件。原因大概有三个:
第一是二进制文件比较节约空间,这两者储存字符型数据时并没有差别。但是在储存数字,特别是实型数字时,二进制更节省空间;第二个原因是,内存中参加计算的数据都是用二进制无格式储存起来的,因此,使用二进制储存到文件就更快捷。如果储存为文本文件,则需要一个转换的过程。在数据量很大的时候,两者就会有明显的速度差别了。第三,就是一些比较精确的数据,使用二进制储存不会造成有效位的丢失。
转自: - 能存储的数据类型不同
-
文本文件和二进制文件区别
2020-04-13 16:05:12广义上的二进制文件包括文本文件,这里讨论的是狭义上...广义上的二进制文件包括文本文件,这里讨论的是狭义上的二进制文件与文本文件的比较:
- 能存储的数据类型不同
文本文件只能存储char型字符变量。二进制文件可以存储char/int/short/long/float/……各种变量值。 - 每条数据的长度
文本文件每条数据通常是固定长度的。以ASCII为例,每条数据(每个字符)都是1个字节。进制文件每条数据不固定。如short占两个字节,int占四个字节,float占8个字节…… - 读取的软件不同
文本文件编辑器就可以读写。比如记事本、NotePad++、Vim等。二进制文件需要特别的解码器。比如bmp文件需要图像查看器,rmvb需要播放器…… - 操作系统对换行符(‘\n’)的处理不同(不重要)
文本文件,操作系统会对’\n’进行一些隐式变换,因此文本文件直接跨平台使用会出问题。
在Windows下,写入’\n’时,操作系统会隐式的将’\n’转换为”\r\n”,再写入到文件中;读的时候,会把“\r\n”隐式转化为’\n’,再读到变量中。
在Linux下,写入’\n’时,操作系统不做隐式变换。
二进制文件,操作系统不会对’\n’进行隐式变换,很多二进制文件(如电影、图片等)可以跨平台使用。
从存储方式来说,文件在磁盘上的存储方式都是二进制形式,所以,文本文件其实也应该算二进制文件。先从他们的区别来说,虽然都是二进制文件,但是二进制代表的意思不一样。打个比方,一个人,我们可以叫他的大名,可以叫他的小名,但其实都是代表这个人。二进制读写是将内存里面的数据直接读写入文本中,而文本呢,则是将数据先转换成了字符串,再写入到文本中。
要弄明白二者的区别,需要知道文件的读写过程。以读文件为例,
实际上是磁盘 》》 文件缓冲区》》应用程序内存空间这两个转化过程。我们说“文本文件和二进制文件没有区别”,实际上针对的是第一个过程;既然没有区别,那么打开方式不同,为何显示内容就不同呢?这个区别实际上是第二个过程造成的。
文件实际上包括两部分,控制信息和内容信息。纯文本文件仅仅是没有控制格式信息罢了;
实际上也是一种特殊的二进制文件。所以,我们很难区分二者的不同,因为他们的概念上不是完全互斥的。我们说文本文件是特殊的二进制文件,是因为文本文件实际上的解释格式已经确定了:ASCII或者unicode编码。文本文件的一个缺点是,它的熵往往较低,也就是说,其实本可以用更小的存储空间记录这些信息。比如,文本文件中的一个数字65536,需要用5个字节来存储;但是用二进制格式,采用int存储,仅仅需要2个字节。而二进制文件elf和bmp等,都往往有一个head,告诉你文件信息和解释方式。
记事本支持文本文件而不支持二进制文件,所以如果你用记事本打开文本文件那么一切正常,如果打开的是二进制文件就会出现乱码。但也有不乱码的地方,你会注意到那些地方都是字符编码的,而对于int、double等类型所对应的值都是乱码的,这是由于记事本只能够识别字符类型,而无法识别其他类型。
1、二进制文件是把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放,也就是说存放的是数据的原形式。
2、文本文件是把数据的终端形式的二进制数据输出到磁盘上存放,也就是说存放的是数据的终端形式。
字符数据本身在内存中就经过了编码,所以无论是二进制还是文本形式都是一样的,而对于非字符数据来说,例如inti=10;如果用二进制来进行存储的话为1010,但是如果需要用文本形式来进行存储的话就必须进行格式化编码(对1和0分别编码,即形式为‘1’和‘0’分别对应的码值)。
一、文本文件与二进制文件的定义大家都知道计算机的存储在物理上是二进制的,所以文本文件与二进制文件的区别并不是物理上的,而是逻辑上的。这两者只是在编码层次上有差异。简单来说,文本文件是基于字符编码的文件,常见的编码有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操作系统中并不需要,当然,当在两个不同的操作系统上共享文件时,这种存储转换又可能出来。
文本文件是一种计算机文件,它是一种典型的顺序文件,其文件的逻辑结构又属于流式文件。特别的是,文本文件是指以ASCII码方式(也称文本方式)存储的文件,更确切地说,英文、数字等字符存储的是ASCII码,而汉字存储的是机内码。文本文件中除了存储文件有效字符信息(包括能用ASCII码字符表示的回车、换行等信息)外,不能存储其他任何信息。
文本文件是一种由若干行字符构成的计算机文件。文本文件存在于计算机文件系统中。通常,通过在文本文件最后一行后放置文件结束标志来指明文件的结束。文本文件是指一种容器,而纯文本是指一种内容。文本文件可以包含纯文本。一般来说,计算机文件可以分为两类:文本文件和二进制文件。
只含有ASCII字符的文本文件可以在Unix、Macintosh、Microsoft Windows、DOS和其它操作系统之间自由交互,而其它格式的文件是很难做到这一点的。但是,在这些操作系统中,换行符并不相同,处理非ASCII字符的方式也不一致。
.txt是包含极少格式信息的文字文件的扩展名。.txt格式并没有明确的定义,它通常是指那些能够被系统终端或者简单的文本编辑器接受的格式。任何能读取文字的程序都能读取带有.txt扩展名的文件,因此,通常认为这种文件是通用的、跨平台的。
在英文文本文件中,ASCII字符集是最为常见的格式,而且在许多场合,它也是默认的格式。对于带重音符号的和其它的非ASCII字符,必须选择一种字符编码。在很多系统中,字符编码是由计算机的区域设置决定的。常见的字符编码包括支持许多欧洲语言的ISO 8859-1。
由于许多编码只能表达有限的字符,通常它们只能用于表达几种语言。Unicode制定了一种试图能够表达所有已知语言的标准,Unicode字符集非常大,它囊括了大多数已知的字符集。Unicode有多种字符编码,其中最常见的是UTF-8,这种编码能够向后兼容ASCII,相同内容的的ASCII文本文件和UTF-8文本文件完全一致。
微软的MS-DOS和Windows采用了相同的文本文件格式,它们都使用CR和LF两个字符作为换行符,这两个字符对应的ASCII码分别为13和10。通常,最后一行文本并不以换行符(CR-LF标志)结尾,包括记事本在内的很多文本编辑器也不在文件的最后添加换行符。
大多数Windows文本文件使用ANSI、OEM或者Unicode编码。Windows所指的ANSI编码通常是1字节的ISO-8859编码,不过对于像中文、日文、朝鲜文这样的环境,需要使用2字节字符集。在过渡至Unicode前,Windows一直用ANSI作为系统默认的编码。而OEM编码,也是通常所说的MS-DOS代码页,是IBM为早期IBM个人电脑的文本模式显示系统定义的。在全屏的MS-DOS程序中同时使用了图形的和按行绘制的字符。新版本的Windows可以使用UTF-16LE和UTF-8之类的Unicode编码。
由于结构简单,文本文件被广泛用于记录信息。它能够避免其它文件格式遇到的一些问题。此外,当文本文件中的部分信息出现错误时,往往能够比较容易的从错误中恢复出来,并继续处理其余的内容。文本文件的一个缺点是,它的熵往往较低,也就是说,可以用较小的存储空间记录这些信息。
文本文件基本上是定长编码的(也有非定长的编码如UTF-8),基于字符,每个字符在具体编码中是固定的,ASCII码是8个比特的编码,UNICODE一般占16个比特。而二进制文件可看成是变长编码的,因为是值编码,多少个比特代表一个值,完全由自己决定。
广义的二进制文件即指文件,由文件在外部设备的存放形式为二进制而得名。狭义的二进制文件即除文本文件以外的文件。
每个字符由一个或多个字节组成,每个字节都是用的-128—127之间的部分数值来表示的,也就是说,-128——127之间还有一些数据没有对应任何字符的任何字节。如果一个文件中的每个字节的内容都是可以表示成字符的数据,我们就可以称这个文件为文本文件。文本文件只是二进制文件中的一种特例,为了与文本文件相区别,人们又把除了文本文件以外的文件称为二进制文件,由于很难严格区分文本文件和二进制文件的概念,所以我们可以简单地认为,如果一个文件专门用于存储文本字符的数据,没有包含字符以外的其他数据,我们就称之为文本文件,除此之外的文件就是二进制文件。
为什么要使用二进制文件。原因大概有三个:
第一是二进制文件比较节约空间,这两者储存字符型数据时并没有差别。但是在储存数字,特别是实型数字时,二进制更节省空间;第二个原因是,内存中参加计算的数据都是用二进制无格式储存起来的,因此,使用二进制储存到文件就更快捷。如果储存为文本文件,则需要一个转换的过程。在数据量很大的时候,两者就会有明显的速度差别了。第三,就是一些比较精确的数据,使用二进制储存不会造成有效位的丢失。
转自:<li class="tool-item tool-active is-like "><a href="javascript:;"><svg class="icon" aria-hidden="true"> <use xlink:href="#csdnc-thumbsup"></use> </svg><span class="name">点赞</span> <span class="count">40</span> </a></li> <li class="tool-item tool-active is-collection "><a href="javascript:;" data-report-click="{"mod":"popu_824"}"><svg class="icon" aria-hidden="true"> <use xlink:href="#icon-csdnc-Collection-G"></use> </svg><span class="name">收藏</span></a></li> <li class="tool-item tool-active is-share"><a href="javascript:;" data-report-click="{"mod":"1582594662_002"}"><svg class="icon" aria-hidden="true"> <use xlink:href="#icon-csdnc-fenxiang"></use> </svg>分享</a></li> <!--打赏开始--> <!--打赏结束--> <li class="tool-item tool-more"> <a> <svg t="1575545411852" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5717" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M179.176 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5718"></path><path d="M509.684 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5719"></path><path d="M846.175 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5720"></path></svg> </a> <ul class="more-box"> <li class="item"><a class="article-report">文章举报</a></li> </ul> </li> </ul> </div> </div> <div class="person-messagebox"> <div class="left-message"><a href="https://blog.csdn.net/colourful_sky"> <img src="https://profile.csdnimg.cn/2/C/9/3_colourful_sky" class="avatar_pic" username="colourful_sky"> <img src="https://g.csdnimg.cn/static/user-reg-year/2x/6.png" class="user-years"> </a></div> <div class="middle-message"> <div class="title"><span class="tit"><a href="https://blog.csdn.net/colourful_sky" data-report-click="{"mod":"popu_379"}" target="_blank">随心1993</a></span> </div> <div class="text"><span>发布了52 篇原创文章</span> · <span>获赞 236</span> · <span>访问量 43万+</span></div> </div> <div class="right-message"> <a href="https://im.csdn.net/im/main.html?userName=colourful_sky" target="_blank" class="btn btn-sm btn-red-hollow bt-button personal-letter">私信 </a> <a class="btn btn-sm bt-button personal-watch" data-report-click="{"mod":"popu_379"}">关注</a> </div> </div> </div>
- 能存储的数据类型不同
-
文本文件和二进制文件比较
2017-06-29 02:44:00广义上的二进制文件包括文本文件,这里讨论的是狭义上的二进制文件与文本文件的比较: 能存储的数据类型不同文本文件只能存储char型字符变量。 二进制文件可以存储char/int/short/long/float/……各种变量值。 每条... -
文本文件和二进制文件
2019-09-12 14:17:49文本文件是指完全由可见字符组成的文件。所谓可见字符是指ASCII码为32到126的字符、回车符...而二进制文件则有多种定义方式,广义的二进制文件是指电脑中的所有文件(包括文本文件),因为电脑中的所有文件其实都... -
二进制文件和非二进制文件
2012-09-17 14:34:53二进制文件和非二进制文件 1. 流式文件:文件中的数据是一串字符,没有结构。 2. 文本文件是一种典型的顺序文件,其文件的逻辑结构又属于流式文件。特别的是,文本文件是指以ASCII码方式(也称文本方式)存储... -
二进制文件转文本文件_「30」学习Python文件操作前必须掌握的2个知识点
2020-12-11 02:03:10一个完整的程序一般都包括数据的存储和读取;但截至目前写的程序数据都没有进行实际的存储,因此 python 解释器...按文件中数据组织形式,我们把文件分为文本文件和二进制文件两大类。【1】文本文件文本文件存储的... -
文本文件和二进制文件的差异和区别(转)
2020-01-08 10:15:06广义上的二进制文件包括文本文件,这里讨论的是狭义上的二进制文件与文本文件的比较: 能存储的数据类型不同 文本文件只能存储char型字符变量。二进制文件可以存储char/int/short/long/float/……各种变量值。 每... -
C语言实现文件复制功能(包括文本文件和二进制文件)
2018-05-08 21:41:00能够复制的文件包括文本文件和二进制文件,你可以复制1G的电影,也可以复制1Byte的txt文档。实现文件复制的主要思路是:开辟一个缓冲区,不断从原文件中读取内容到缓冲区,每读取完一次就将缓冲区中的内容写入到新建... -
文本文件与其他二进制文件的区别
2017-09-26 16:19:31文本文件是一种二进制文件,因为它与其他二进制文件相比较为特殊,所以有了这个“区别”问题,即fopen时参数指定为w和wb的区别。 广义上的二进制文件包括文本文件,这里讨论的是狭义上的二进制文件与文本文件的... -
128 C语言实现文件复制功能(包括文本文件和二进制文件)
2018-06-07 17:23:00能够复制的文件包括文本文件和二进制文件,你可以复制1G的电影,也可以复制1Byte的txt文档。实现文件复制的主要思路是:开辟一个缓冲区,不断从原文件中读取内容到缓冲区,每读取完一次就将缓冲区中的内容写入到新建... -
linux怎么区别文本文件和二进制文件
2019-10-07 07:04:05linux的文本文件与二进制文件的区分与windows的区分是相同的!说到底计算机存储的文件都是以二进制形式存储的,但是区别是,习惯上认为:(1)、文本文件文本文件是包含用户可读信息的文件。这些文件以ASCII码方式存储... -
python087(文件—文件概念以及文本文件和二进制文件的区别)
2019-06-10 20:30:17文件的概念和作用 计算机的文件,就是存储某种长期储存设备上的一段数据 长期存储设备包括:硬盘、U盘、移动...文本文件和二进制文件 文本文件 可以使用文本编辑器软件查看 本质上还是二进制文件 例如:Pytho... -
C语言知识汇总 | 81-C语言实现文件复制功能(包括文本文件和二进制文件)
2020-10-30 22:38:33能够复制的文件包括文本文件和二进制文件,你可以复制1G的电影,也可以复制1Byte的txt文档。实现文件复制的主要思路是:开辟一个缓冲区,不断从原文件中读取内容到缓冲区,每读取完一次就将缓冲区中的内容写入到新建... -
C/C++:文本文件和二进制文件的读写
2018-02-28 15:47:42本经验主要包括以下几部分:1、C++基础:数据流,缓冲区,文件类型2、C语言:缓冲区文件处理:3、文件读写流程:4、文本文件操作:5、格式化存取函数6、二进制文件操作工具/原料Visual Studio... -
二进制文件查看和修改
2012-12-22 16:32:33可以查看和修改二进制文件,当然也包括文本文件。以十六进制和文本同时显示文件内容。可以按字节修改文件内容。 -
文本文件与二进制文件
2017-09-12 00:00:00计算机文件分为两类:文本文件和二进制文件。 一、相关定义 特别的是,文本文件是指以ASCII码方式(也称文本方式)存储的文件,更确切地说,英文、数字等字符存储的是ASCII码,而汉字存储的是机内码。文本文件中... -
c语言实现指定路径文件读取_C语言实现文件复制功能(包括文本文件和二进制文件)...
2020-11-29 04:53:30能够复制的文件包括文本文件和二进制文件,你可以复制1G的电影,也可以复制1Byte的txt文档。实现文件复制的主要思路是:开辟一个缓冲区,不断从原文件中读取内容到缓冲区,每读取完一次就将缓冲区中的内容写入到新建... -
文本文件和二进制文件的区别
2017-01-22 14:08:00文本文件: 文本文件是一种计算机文件,它是一种典型的顺序...文本文件中除了存储文件有效字符信息(包括能用ASCII码字符表示的回车、换行等信息)外,不能存储其他任何信息。 文本文件是一种由若干行字符... -
文本文件不能用二进制文件方式读入_Python文件
2021-01-29 11:10:49目标文件的概念文件的...文件的作用将数据长期保存下来,在需要的时候使用文件的存储方式在计算机中,文件是以 二进制 的方式保存在磁盘上的文本文件和二进制文件文本文件可以使用 文本编辑软件 查看本质上还是二... -
二进制 文件 读入_文件的概念和作用
2021-01-13 12:37:34文件的作用将数据长期保存下来,在需要的时候使用文件的存储方式在计算机中,文件是以二进制的方式保存在磁盘上的文本文件和二进制文件文本文件 可以进行文本编辑软件查看 本质上还是二进制文件 例如:python的源程序... -
Oracle建立二进制文件索引的方法
2020-12-16 13:34:54正在看的ORACLE教程是:Oracle建立二进制文件索引的方法。Oracle text是Oracle的全文检索技术,是9i版本标准版和企业版的一部分。Oracle text使用标准的sql语言索引、查找、分析存储在oracle数据库、文件或者网络里... -
[Matlab+C/C++] 读写二进制文件
2016-03-08 01:08:00在处理某些数据的时候,可能涉及...幸运的是MATLAB可以读写自定义格式的二进制文件,基本所有程序语言(包括C/C++)在内,都是支持二进制文件的读写操作的。本文就介绍一下如何使用MATLAB和C/C++对二进制文件进行读写。 -
numpy读取dat文件_Numpy读写二进制数据和NCL二进制数据I/O
2020-12-07 05:02:39Numpy读写二进制数据...file表示文件名,dtype表示数据类型(包括大小和字节顺序),count表示读入数据长度,sep表示文本文件的分隔符,默认为空表示读取二进制数据。图片来自《利用python进行数据分析》第二版>...
-
密码类
-
upload.zip
-
手把手教你爬取优酷电影信息-1
-
第九十四题:有一条长阶梯:如果每步跨 2阶,那么最后剩 1 阶;如果每步跨 3 阶,那么最后剩 2 阶;如果每步跨 5 阶,那么最后剩 4 阶;如果每步跨 6 阶,那么最后剩 5 阶;只有当每步跨 7
-
MySQL 性能优化(思路拓展及实操)
-
[转载] C++ STL之 vector的capacity和size属性区别
-
ContactMyReps:contactmyreps.com Web应用程序-源码
-
使用 Linux 平台充当 Router 路由器
-
go每日新闻(2021-02-25)——悄悄告诉你:很可能Go 1.17就能尝试泛型
-
ApacheSpark大数据分析入门(一)
-
从一手资料学习--Spring Security与OAuth(二)
-
如何成为一个优秀的培训师.ppt
-
MySQL 管理利器 mysql-utilities
-
小程序循环双重数组渲染
-
DHCP 动态主机配置服务(在Linux环境下,配置单网段或跨网段提)
-
Latex使用详解(以EMNLP2020模板为例)
-
Lazarus 2021年最新版下载
-
Samba 服务配置与管理
-
[转载] pythonjson构建二维数组_python二维键值数组生成转json的例子
-
基于Qt的LibVLC开发教程