网站开发源码售卖合同,广州做大型网站建设,郑州seo课程,asp.net 做网站前言
本篇文章介绍一下C语言的文本模式和二进制模式
文本文件和二进制文件
从宏观上看#xff0c;无论是文本文件还是二进制文件#xff0c;文件中保存的都是0和1的序列#xff0c;因为磁盘只有这两种状态。不同的文件只是对0、1序列的解释不同#xff0c;如果文件内容是…前言
本篇文章介绍一下C语言的文本模式和二进制模式
文本文件和二进制文件
从宏观上看无论是文本文件还是二进制文件文件中保存的都是0和1的序列因为磁盘只有这两种状态。不同的文件只是对0、1序列的解释不同如果文件内容是以字符编码的方式保存到文件中的无论是以哪种编码方式比如使用ascii编码unicode编码都可以这样的文件就是文本文件也就是文本文件中存在的是一个个字符。如果文件保存的是机器可以识别的数值在内存中的表示或者是图片、音频等编码的数据那这种文件就是二进制文件举个简单的例子对于数字
int i10000如果我们用文本方式保存该值应该保存’1’、‘0’、‘0’、‘0’、0’五个字符但是如果以二进制表示呢我们只需要保存i的二进制表示 00000000 00000000 00100111 00010000 按照小端法保存依此应该是00010000 00100111 00000000 00000000
C语言的文本模式和二进制模式
C语言之所以要区分文本模式和二进制模式主要原因就是不同的平台对文本文件的操作不一样看下面这段代码
#include stdio.h
int main(void)
{printf(\\r%hhd,\\n%hhd\n,\r,\n);FILE* file fopen(test.d, w);fprintf(file, A\nB);fclose(file);file fopen(test.d, rb);char ch ;while((chgetc(file))!EOF){printf(%c,%hhd\n,ch,ch);}fclose(file);return 0;
}在mac上显示结果如下
\r13,\n10
A,65,10
B,66在win上显示结果如下
\r13,\n10
A,65
,13,10
B,66可以发现在mac上以文本模式存储换行符存储的是\n据说老版mac存的是\r在windows系统上存储的是\r\n鉴于此C标准针对文本模式读取写入换行符的时候进行了处理读取换行符的时候统一转换成\n写入换行符的时候根据不同系统写入不同的数据比如windows就写入\r\n把上面的例子读取文件从二进制模式修改为文本模式
#include stdio.h
int main(void)
{printf(\\r%hhd,\\n%hhd\n,\r,\n);FILE* file fopen(test.d, w);fprintf(file, A\nB);fclose(file);file fopen(test.d, r);char ch ;while((chgetc(file))!EOF){printf(%c,%hhd\n,ch,ch);}fclose(file);return 0;
}在windows上执行结果如下
\r13,\n10
A,65,10
B,66可以发现\r\n转换成了\n
还有一点需要注意对于文本模式和二进制模式我们使用ftell获取字节数大小的时候
windows系统换行符算两个字节不管文本模式还是二进制模式mac系统换行符算一个字节对于windows系统文本模式获取的换行符为虽然算两个字符但是打印出来的都是\n 看下面的例子
#include stdio.h
int main(void)
{printf(\\r%hhd,\\n%hhd\n, \r, \n);FILE* file fopen(test.d, r);fseek(file, 0, SEEK_END);long size ftell(file);for (int i1;isize;i){fseek(file, -i, SEEK_END);printf(%hhd\n,getc(file));}printf(size:%ld\n, size);fclose(file);return 0;
}在mac系统下输出的字节大小都是3 在windows系统下输出的字节大小是4文本模式输出如下
\r13,\n10
66
10
10
65
size:4二进制模式输出如下
\r13,\n10
66
10
13
65
size:4总结
我们一般使用二进制模式保存的数据都是我们定义好的数据结构数据这种数据是不需要换行符这种东西的基本是为了数据的安全或者更紧凑。我们自己负责数据的修改和解析
如果是为了显示或者便于别人编辑的数据建议保存成文本文件。