关于C之二进制模式与文本模式 您所在的位置:网站首页 文本格式文件是什么意思 关于C之二进制模式与文本模式

关于C之二进制模式与文本模式

2024-07-17 11:38| 来源: 网络整理| 查看: 265

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

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

但是如果用了文本模式,那么操作系统在将文件内容传给上层程序(库函数,或者是你的程序)时,或者上层程序通过操作系统向文件写入内容时,操作系统都会预先进行一层预处理(或者说转义),具体过程依赖于操作系统的实现。在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 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



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有