问题始于社区的一个帖子,楼主的问题如下:

“在c语言中,对一个不知道大小的文件进行读操作,我用fread()将文件的内容先放到一个缓存区,然后将缓存区中的内容打印出来,

缓存区中的内容和文件中的内容不一样,好像是因为缓存区的空间比存储文件内容所需要的空间大了,不知道应该怎么解决”

这个问题我之前也碰到过,翻了一些C语言文件操作方面的资料,发现对于换行的处理,其实是一个从打字机时代就有的历史遗留问题:

“在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符。但是它有一个问题,就是打

完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。 于是,研制人员

想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做“回车”,告诉打字机把打印头定位在左边界;另一个叫做“换行”,

告诉打字机把纸向下移一行。 ”

在计算机出现之后,这种概念又被移植到了计算机操作系统上。当然,对于是否移植这一点也是有争议的,Windows和Unix/Mac系统在这一点

上就分道扬镳了。

下面首先讨论在Windows平台下的情况。

Windows平台采用了历史的概念,在文件中,换行被处理为“\r\n”两个字符,也就是说,虽然用户只敲了一次回车键,但其实系统

会认为收到了“\r\n”两个字符,并同时存储了这两个字符。

因此,在Windows平台下,文件为了存储一次换行会写入两个字符。当程序员试图从文件中读取文件内容时,C语言提供了两种方式:文本方

式和二进制方式,这两种方式又有什么区别呢?

在Windows平台下,采用文本方式打开一个文件时,会自动将一次换行,即“\r\n”两个字符转换成一个“\n”字符,即会去掉一个“\r”

字符,这种转换的结果就是:实际读取的数据长度会比文件的真实长度短,两者之差等于文件中的换行次数。而当采用二进制方式打开

一个文件时,由于二进制方式打开的特点是有什么读什么,因此,“\r\n”两个字符会原封不动,均被读取,因而实际读取的数据长度与

原文件长度相同。

由于这种区别的存在,推荐大家在读取文件时采用二进制方式,文件中是什么内容,读取到的就是什么内容。

那么,在Unix平台下呢?

Unix/Mac平台并没有采用Windows平台的方式,在Unix/Mac中,每一行的结尾只有一个换行符,即“\n”,因此,Unix/Mac平台下两种读取方式

是不会有区别的。

一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,

某些文本编辑器可能在每行的结尾会多出一个^M符号。

 

换行符\n和回车符\r的更多相关文章

  1. 换行符‘\n’和回车符‘\r’

    顾名思义,换行符就是另起一行,回车符就是回到一行的开头,所以我们平时编写文件的回车符应该确切来说叫做回车换行符 '\n' 10 换行(newline)'\r' 13 回车(return) 也可以表示为 ...

  2. 换行符 '\n' 和 回车符 '\r' 的区别?

    顾名思义: 换行符就是另起一新行,光标在新行的开头: 回车符就是光标回到一旧行的开头:(即光标目前所在的行为旧行) ------------------------------------------ ...

  3. Word 查找替换高级玩法系列之 -- 将换行符替换成回车符

    我们从网上Copy过来的很多Word文档,里面使用的都是换行符,也就是我们常说的软回车,它显示为一个向下的箭头.这些符号不仅碍眼,而且会影响我们后期的排版,尤其是对段落的排版,因为Word里面的段落只 ...

  4. Windows、Unix、Mac不同操作系统的换行问题-剖析回车符\r和换行符\n

    转载链接:http://blog.csdn.net/tskyfree/article/details/8121951 一.概念: 换行符‘\n’和回车符‘\r’ (1)换行符就是另起一行  --- ' ...

  5. SQL替换空格,制表符,换行符,回车符.

    首先是空格的替换,很重要的有点是,要确保字段的类型,不是char或nchar等固定的类型,否则无法去掉空格. 去掉空格很简单,如下为SQL实例: --去掉 T_StuffBasic 表中FBranch ...

  6. sqlserver数据库 去除字段中空格,换行符,回车符(使用replace语句)

    SQL中可以使用Replace函数来对某个字段里的某些字符进行替换操作,语法如下: 语法 REPLACE ( original-string, search-string, replace-strin ...

  7. MYSQL表记录字段换行符回车符处理

    ), ), '');  CHAR(10): 换行符 CHAR(13): 回车符

  8. MySQL 去除字段中的换行和回车符

    今天csv 导入关键词的时候遇到问题 字段结束会有 回车符号 解决方法: ), ),'');          char(10):  换行符          char(13):  回车符

  9. 关于MYSQL表记录字段换行符回车符处理

    http://hualong.iteye.com/blog/1933023 今天遇到一个非常奇葩的问题,数据库表中明明有值却查询不不出来,而然一次从单元格中复制到sql中,发现右侧单引号换行了,我初步 ...

随机推荐

  1. MIPI协议-DSI

    对于现代的智能手机来说,其内部要塞入太多各种不同接口的设备,给手机的设计 和元器件选择带来很大的难度.下图是一个智能手机的例子,我们可以看到其内部存储.显示.摄像.声音等内部接口都是各不相同的.即使以 ...

  2. contain_of宏定义

    Container_of在Linux内核中是一个常用的宏,用于从包含在某个结构中的指针获得结构本身的指针,通俗地讲就是通过结构体变量中某个成员的首地址进而获得整个结构体变量的首地址. 实现方式: co ...

  3. 解决:java.io.IOException: No FileSystem for scheme: hdfs

    解决:java.io.IOException: No FileSystem for scheme: hdfs 开发项目初期,写完代码开始放到服务器上开始测试的时候,报出这样的一个错,不知道怎么处理了, ...

  4. github免密登陆

    import requests import re # 一:先获取登陆页面,拿到authenticity_token: # 1 请求的url:https://github.com/login # 2 ...

  5. web前端性能优化总结

    网站的划分一般为二:前端和后台.我们可以理解成后台是用来实现网站的功能的,比如:实现用户注册,用户能够为文章发表评论等等.而前端呢?其实应该是属于功能的表现.并且影响用户访问体验的绝大部分来自前端页面 ...

  6. Codeforces Beta Round #1 A,B,C

    A. Theatre Square time limit per test:1 second memory limit per test:256 megabytes input:standard in ...

  7. DFS+打表

    N皇后问题 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status ...

  8. sublime text 3如何安装插件

    原博客地址:http://blog.csdn.net/weixin_40682842/article/details/78727266 我自己的部分操作如下: 学习Sublime Text扩展插件的安 ...

  9. c语言基础学习06

    =============================================================================涉及到的知识点有:1.C语言库函数.字符输入函 ...

  10. SpringMVC框架学习笔记——各种异常、报错解决

    1.Target runtime com.genuitec.runtime.generic.jee60 is not defined. 找到导入项目的.setting文件夹org.eclipse.ws ...