为什么要说这个简单的问题?

众所周知,在Windows下文本文件的换行符是CRLF,占两个字节。在Unix下是LF,占一个字节。(还有奇葩的Mac是CR)。但是C语言中直接printf一个 ‘\n’,在Windows下就是CRLF两个字符,然后getchar读入,又成了’\n’这一个字符。这不是有点奇怪吗?大多脚本语言还有Java中,‘\n’就是LF一个字节,ASCII码是10。

先普及一个历史故事

计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。

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

这就是“换行”和“回车”的来历,从它们的英语名字上也可以看出一二。

后来,计算机发明了,这两个概念也就被般到了计算机上。那时,存储器很贵,一些科学家认为在每行结尾加两个字符太浪费了,加一个就可以。于是,就出现了分歧。Unix 系统里,每行结尾只有“”,即“\n”;Windows系统里面,每行结尾是“”,即“ \r\n”;Mac系统里,每行结尾是“”。一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号。

C语言测试代码

在Windows下运行下面的代码:

#define _CRT_SECURE_NO_WARNINGS

#include

int main()

{

freopen("123456.txt", "w", stdout);

char* str = "abc\n";

printf(str);

return ;

}

“123456.txt”这一文件中就会有5个字节:‘a’ ‘b’ ‘c’ ‘CR’ ‘LF’。

但是如果把代码改成这样:

#define _CRT_SECURE_NO_WARNINGS

#include

int main()

{

freopen("123456.txt", "wb", stdout);

char* str = "abc\n";

printf(str);

return ;

}

就只有4个字节了:‘a’ ‘b’ ‘c’ ‘LF’。

原因往往都是最简单的

标准C语言的文本流提供系统无关抽象层。

总结来说就是上面一句话。\n 在文本模式下是逻辑新行符,读写时可根据平台和物理存储之间进行转换,我们平时用标准C的输入输出时完全不用关注这一点,但是如果我们绕过标准输入输出直接调用windows中coredll.lib进行控制台输入输出时就必须面对这一现实。

个人观点

标准问题往往都是无休止的争论,CRLF的争论也一直没有停止过。CRLF与历史更加统一,而LF更加简洁,并没有严格的孰优孰劣之分。

Python语言中enumerate()及zip()函数的使用例子

在Python编程语言中,enumerate()及zip()是两个常用的内置函数,这两个函数功能类似,但又有所区别,下面通过两个例子分别进行说明. enumerate()函数 该函数在字面上是枚举.列 ...

C语言中,头文件和源文件的关系(转)

简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程: 1.预处理阶段 2.词法与语法分析阶段 3.编译阶段,首先编译成纯汇编语句, ...

C 语言中 setjmp 和 longjmp

在 C 语言中,我们不能使用 goto 语句来跳转到另一个函数中的某个 label 处:但提供了两个函数——setjmp 和 longjmp来完成这种类型的分支跳转.后面我们会看到这两个函数在处理异常 ...

c语言中的scanf在java中应该怎么表达,Scanner类。

1 java是面向对象的语言 它没有像C语言中的scanf()函数,但是它的类库中有含有scanf功能的函数 2 java.util包下有Scanner类 Scanner类的功能与scanf类似 3 ...

C语言中do...while(0)的妙用(转载)

转载来自:C语言中do...while(0)的妙用,感谢分享. 在linux内核代码中,经常看到do...while(0)的宏,do...while(0)有很多作用,下面举出几个: 1.避免goto语 ...

C语言中,定义的含义?声明的含义?它们之间的区别是什么?

在C语言中,对于定义和声明,也许我们非常的熟悉,但不一定真正的了解! 定义的含义:所谓定义,就是创建(编译器)一个对象,为这个对象分配一块内存空间并取名,也就是我们平常所说的变量名或对象名,一旦这个名 ...

C++中函数的默认参数和C语言中volatile的学习

1.函数默认参数 1 int func(int a,int b=10) 2 { 3 return a*b; 4 } 5 6 int main() 7 { 8 int c=func(2); 9 cout ...

C语言中qsort函数用法

C语言中qsort函数用法-示例分析    本文实例汇总介绍了C语言中qsort函数用法,包括针对各种数据类型参数的排序,非常具有实用价值非常具有实用价值. 分享给大家供大家参考.C语言中的qsort ...

c语言中time相关函数

工作中遇到的函数: int seed = time(NULL); srand(seed); signal(SIGINT, stop); signal(SIGUSR1, sig_usr1); 搜time ...

随机推荐

Ajax跨域问题的两种解决方法

浏览器不允许Ajax跨站请求,所以存在Ajax跨域问题,目前主要有两种办法解决. 1.在请求页面上使用Access-Control-Allow-Origin标头. 使用如下标头可以接受全部网站请求: ...

解决宿主机不能访问虚拟机CentOS中的站点 | 更新CentOS防火墙设置开启80端口访问

前阵子在虚拟机上装好了centos6.0,并配好了nginx+php+mysql,但是本机就是无法访问.一直就没去折腾了. 具体情况如下 1.本机能ping通虚拟机 2.虚拟机也能ping通本机 3. ...

defer 和 async 本地对象和宿主对象

没有defer和async的情况下是"同步执行"的,浏览器解析到这里的时候,会先加载资源完成后立即执行,并阻 ...

【C】——幻方算法

一.幻方按照阶数可分成了三类,即奇数阶幻方.双偶阶幻方.单偶阶幻方. 二.奇数阶幻方(劳伯法) 奇数阶幻方最经典的填法是罗伯法.填写的方法是: 把1(或最小的数)放在第一行正中:按以下规律排列剩下的( ...

第五篇 SQL Server安全架构和安全

本篇文章是SQL Server安全系列的第五篇,详细内容请参考原文. 架构本质上是一个数据库对象,其他对象的一个容器,在复杂的数据库中它能够很容易的管理各组对象.架构具有重要的安全功能.在这一篇你会学 ...

Comparing cards

For built-in types, there are conditional operators (, ==, etc.) that compare values and d ...

HDU1437+模拟

枚举中间可能出现的天气 #include #include #include ; ][ ]; void s ...

SRM 396(1-250pt)

DIV1 250pt 题意:对于一个字符串s,若对于每一个i = 0 to s.size()-p-1都有s[i] = s[i+p]则称字符串s是p循环的."CATCATC", &q ...

Python偏函数实例

目标: 1.编写一个gui,生成按钮 2.通过偏函数,生成按钮 3.通过装饰器,实现按钮输出信息功能 1.使用Tkinter,创建一个按钮 代码如下: handetiandeMacBook-Pro:~ ...

BZOJ2882工艺

题目描述 小敏和小燕是一对好朋友. 他们正在玩一种神奇的游戏,叫Minecraft. 他们现在要做一个由方块构成的长条工艺品.但是方块现在是乱的,而且由于机器的要求,他们只能做到把这个工艺品最左边的方 ...

c语言中用两个n表示什么格式,C语言中‘\n'为什么能表示CRLF两个字节相关推荐

  1. 在c语言中 一个函数一般由两个部分组成的,在C语言中,一个函数一般由两个部分组成,它们是______和______。...

    在C语言中,一个函数一般由两个部分组成,它们是______和______. 更多相关问题 [判断题]铁能从硫酸铜溶液中取代出铜,是因为铁与硫酸根具有更大的亲和力. A. 对 B. 错 [多选题]进行关 ...

  2. c语言中保存字符串实质上是,在C语言中,保存字符串“B”实质上是保存字符B和\0两个符号。...

    在C语言中,保存字符串"B"实质上是保存字符B和\0两个符号. 中字符字符下列哪个选项不属于授权的事项?() 保存保存四大()之首卢浮宫是人类最伟大的一个建筑. 实质上1889年庆 ...

  3. c语言中什么函数可以作为虚函数,C++语言中的“虚函数”就像C语言中的指针,必须要弄懂的...

    上一节较为详细的讨论了C++语言中基类被派生类继承过程中的内存模型,尤其较为详细的分析了虚函数及其虚表.虚表指针在内存中是如何分布,如何存储的,这对于理解C++语言中的"动态绑定" ...

  4. c语言include的用法 相对目录 绝对目录,c语言中include的用法

    <c语言中include的用法>由会员分享,可在线阅读,更多相关<c语言中include的用法(3页珍藏版)>请在人人文库网上搜索. 1.c语言中in elude 的用法c语言 ...

  5. c语言switch语句支持的字符有哪些,C语言中switch()语句的括号内可以是什么型别的呢?...

    C语言中switch()语句的括号内可以是什么型别的呢?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! C语言中swit ...

  6. c语言4钟存储类型关键字用法,求C语言中的32个关键字及其意思? C语言中32个关键字的意思和用法~!...

    C语言中的32个关键字及其意思如下: 1.auto    声明自动变量 2.short    声明短整型变量或函数 3.int    声明整型变量或函数 4.long    声明长整型变量或函数 5. ...

  7. 在java语言中 ()方法是不可以继承的_Java 语言中,构造方法是不可以继承的。( )_学小易找答案...

    [简答题]需求分析完整话术 [简答题] [单选题]适用于场地面积有限,集装箱吞吐量较大的水陆联运码头的起重机系统是( )系统 [单选题]利用叉车或半挂车.汽车承载货物,连同车辆一起开上开下船,到达目的 ...

  8. 关于python语言中缩进的说法_以下关于Python语言中“缩进”说法正确的是:

    [多选题]From the perspective of the production enterprise (the content is more extensive), any differen ...

  9. c语言switch语句最大嵌套数,浅谈C语言中switch 语句的嵌套使用

    浅谈C语言中switch 语句的嵌套使用 作者:未知 [摘要]switch语句是一种分支控制语句,它的应用在程序设计中起至了很重要的作用.由于其格式复杂,对于初学者来说很难掌握,switch语句的嵌套 ...

最新文章

  1. windows10安装docker
  2. 人脸检测--Grid Loss: Detecting Occluded Faces
  3. linux查看服务器设备信息命令dmidecode
  4. JVM内存区域:常用指令集
  5. Python编程专属骚技巧9
  6. php redis 扩展 编译安装,Linux 下 PHP 扩展 redis 编译安装
  7. 小程序点击地图气泡获取气泡_气泡上的气泡
  8. java线程提高速度_如何在JAVA中减慢线程速度
  9. SpringBoot2整合Activiti6工作流框架 源码
  10. java垃圾回收机制标记_Java的垃圾回收机制-垃圾收集算法(一)
  11. 1011. World Cup Betting (20)——PAT (Advanced Level) Practise
  12. Windows环境下log4cxx的编译及使用(转载)
  13. 南阳oj-----D的小L(algorithm全排列用法)
  14. Dynamic Rankings(整体二分)
  15. QT递归获取指定目录下的所有文件
  16. vi/vim编辑器常用命令
  17. 将字符串中的英文大写字母换成小写字母-c语言实现
  18. [技术分享 – FCS 篇] 驭龙五式3之飞龙在天:安装 FCS 服务器
  19. 新操作系统有哪些新功能?一起来看看吧!
  20. 器件选型电源篇-DC/DC器件选型

热门文章

  1. Python入门(第二节):Python编译器安装
  2. ASP.NET 简洁论坛 (含源代码)转
  3. 检测浏览器是否支持WMP(Windows Media Player)
  4. 推荐几个Mac超好用软件/工具 工作效率提高300%!
  5. MySql删除表中重复数据
  6. 解决Linux删除用户时进程占用,及新建账户提示主目录已存在、信箱文件已存在的问题
  7. Debian11.6配置noVNC做远程桌面服务
  8. Android Animation动画特效
  9. 详解微软Windows Azure云计算平台
  10. 愿做一颗螺丝钉 灵宝西所第一警务区 焦帅宾