二进制形式和文本形式读取文件区别

经过今晚和室友长时间的实验,得出了以下规律

Ascii码
10: \n          //全称new line         换行键
13: \r          //全称carriage return  回车键    
这里主要看英文意思,carriage return是把光标移到当前行首位

在不同的操作系统中,换行符的表示方式是不一样的。在UNIX系统中,换行符使用"\n" , 在 windows 系统中换行使用 “\r\n”。

所以当我们以二进制形式读取文本并塞进字符串s中,使用substr截取/n之间的字符串的时候,你会多截一个\r,而你文本形式getline就没有

始发 北京西10:00  
11:07石家庄11:09   //长度是16,5+6+5,汉字占2长度
12:30郑州东12:33
14:17武汉14:20
15:38长沙南15:41
18:01广州南18:06
18:45福田 终点
//这是文本形式getline得到的结果
始发 北京西10:00/r  
11:07石家庄11:09/r   //长度是17,5+6+6+1,汉字占2长度
12:30郑州东12:33/r
14:17武汉14:20/r
15:38长沙南15:41/r
18:01广州南18:06/r
18:45福田 终点/r
//这是二进制形式substr得到的结果
//注意/r是非显示字符,所以你看上去是一样的

你可能觉得好像没啥影响,毕竟输出看起来是一样的,我们来看特殊情况

string s="123";
s=s+'\r';
cout<<s<<5554;
输出结果是5554,很好\r使用一次就没了,不然预期输出是455

假设你用把"11:07石家庄11:09/r"放到字符串s里
你使用cout<<s<<"00";
你得到的输出结果是: 00:07石家庄11:09

所以是有这么一点小麻烦的

还有一点麻烦是,你用s.size()的时候,多的非显示\r会让你的s.size()比你预期的多1个

说下结论吧

文本文件与二进制文件的读写
【https://wenku.baidu.com/view/d7dfd688680203d8ce2f243c.html】

以什么模式打开文件根本不重要,只要关心这个文件里的数据内容本身是二进制格式还是文本格式就好了!如果内容是文本格式的,你就调用文本格式那一套函数,比如puts,gets,fscanf,fprintf,<<,>>等,如果内容是二进制格式的,你就调用二进制格式那一套函数,比如fread,fwrite,ifstream.read(),ofstream.write()等。 保持文件内容与处理函数相对应。

【http://blog.csdn.net/songjinshi/article/details/7789584】

有数据要存储的时候.首先得考虑你要存储的数据是字符数据还是非字符数据,再来判断选择用二进制文件还是文本文件来进行存储。(字符数据放在文本/二进制文件中,都和内存中的数据形式没有区别)

【http://www.cnblogs.com/pengwangguoyh/articles/3223072.html】

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

上面主要讨论的是二进制读取会多读一个\r的问题

下面讲一下考试结论叭

二进制就注意一下换行是\r\n就行,二进制就用字符串处理那一套,文本就用getline那一套~
具体看老师给的那个示例程序就行

一只古灵古灵的精怪