热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

windows下操作文件换行符的问题

 为什么写这篇文章?  因为在工作过程中,经常会切换Linux和Windows,操作文档时有两次遇到莫名的问题,怎么查程序都查不出来,因为逻辑都没问题,但是数据就是出错了。查了N

 为什么写这篇文章?

    因为在工作过程中, 经常会切换Linux 和Windows, 操作文档时有两次遇到莫名的问题, 怎么查程序都查不出来, 因为逻辑都没问题,但是数据就是出错了。查了N天,发现是不同操作系统换行符的问题,搞得血都吐了一堆。而网上很多文章感觉都没有讲的很清晰。

 为了不让大家重蹈覆辙,参考了其他网站的文章,特地总结了一下, 希望能在一篇文章里把问题讲解清楚。

    当然,如果其中理解有误的地方,请各位提出来。本来想分析一下源码,但是没有找到相关windows下转换的源码,就暂时不剖析了。如果各们有找到源码的同学,也可以分享一下,谢谢。


回车换行符的历史背景:

     早期的计算机输出设备不是显示器,而是电传打字机,结构与普通的打字机差不多。有一个打印头在纸上打字,同时有一个电动机控制纸张的进出。当打印头到达行尾的时候,需要两个动作才能够到达下一行的行首:

1: 首先执行回车动作,将打印头移动到本行的行首;

2: 然后进行换行动作,电动机将纸张向上移动一行,这样打印头就处于下一行的行首,可以继续进行打印。

 

    回车和换行对应的控制字符分别是\r和\n,这就是windows中换行符为\r\n的由来。

    后来由于经常连续执行,所以在打印机中将这两个控制字符简化为一个控制字符,这就是linux/unix中的换行符\n的由来。


不同操作系统换行符的区别:

Unix 系统中:   每行结尾只有 "<换行>",即 "\n";

          对应十六进制0x0A

Windows 系统中: 每行结尾是 "<回车><换行>",即 "\r\n";

          对应十六进制0x0D 0x0A

Mac 系统中:   每行结尾是 "<回车>",即 "\r"。

          对应十六进制0x0D

 

由于换行符不同, 导致的结果是:

  Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;

  而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号.

 

而在 windows下操作文件fopen使用”r”和”rb”打开文件,  结果是不一样的(Linux下没有区别):

  如果 fopen是”r”文本方式打开, 读文件时会自动转换换物符\r\n为 \n。

  如果 fopen是”r”文本方式打开, 写文件时会自动转换换物符\n为 \r\n。

  如果 fopen是”rb”是以二进制方式打开,不会自动转换。


环境实验:windows fopen r rb的区别

 在windows环境和Linux环境下,分别建立一个文本,内容相同:

  Hello World!

  5AA555AA

windows下创建的文件,命名为windows.txt

Linux下创建的文件,命名为Linux.txt

写个程序将使用fopen( path, “rb” ) 文本里面的内容读出来:

#include

 

int main( int argc, char ** argv ){

  FILE *fp;

  char buf[255] = { 0 };

  size_t num = 0;

  int i = 0;

 

  if( argc != 2 ){

  printf( "You need to input the file to read!" );

  return -1;
}


 if((fp = fopen( argv[1], "rb" )) == NULL )
   printf( "file open failed!" );

  while( (num = fread(buf, sizeof(char), 10, fp )) > 0 ){

    for( i = 0; i

      printf( "%02X", buf[i] );

    }

  }

  fclose( fp );

  return 0;

}

fopen( path, rb ) 输出结果为:

 

结果如下:

  windows下创建的文本换行符仍然是 0D0A(即\r\n), 

  Linux下创建的文件为 0A(\n)

 

将上述代码改为 fopen( path, r )

结果如下:

 

如上, 换行符统一被转换为0A(即\n

 

注意: 

如果Linux创建的文本,在windows下有编辑过,文件里面的0A会被转换为0D0A

比如我复制一份Linux.txt 为Linux1.txt, 在windows下用记事板打开文件,显示文件为:

 

 按CTRL+S保存后, 0A被转换为0D0A:

 


文件格式转换:

    那如果我们有文件需要在不同的操作系统中来回切换操作, 怎么处理文档内的换行符呢?


方法1NotePad++ 转换

    设置行尾符格式:编辑 ->  档案格式转换 ->(可选 Windows、Unix 和 Mac中的一种)(如果是英文版的 Notepad++,则应该是 Edit -> EOL Conversion -> Windows Format、Unix/OSX Format、Old Mac Format。)


方法2:  使用UNIX命令转换:

  unix2dos -k xxx_file

  dos2unix -k xxx_file

 

参考文章: 1: https://blog.csdn.net/wzb56_earl/article/details/6860358

      2:https://www.cnblogs.com/cnjavahome/p/8893813.html



推荐阅读
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • Linuxchmod目录权限命令图文详解在Linux文件系统模型中,每个文件都有一组9个权限位用来控制谁能够读写和执行该文件的内容。对于目录来说,执行位的作用是控制能否进入或者通过 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 本文介绍了使用CentOS7.0 U盘刻录工具进行安装的详细步骤,包括使用USBWriter工具刻录ISO文件到USB驱动器、格式化USB磁盘、设置启动顺序等。通过本文的指导,用户可以轻松地使用U盘安装CentOS7.0操作系统。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 树莓派Linux基础(一):查看文件系统的命令行操作
    本文介绍了在树莓派上通过SSH服务使用命令行查看文件系统的操作,包括cd命令用于变更目录、pwd命令用于显示当前目录位置、ls命令用于显示文件和目录列表。详细讲解了这些命令的使用方法和注意事项。 ... [详细]
  • 【Windows】实现微信双开或多开的方法及步骤详解
    本文介绍了在Windows系统下实现微信双开或多开的方法,通过安装微信电脑版、复制微信程序启动路径、修改文本文件为bat文件等步骤,实现同时登录两个或多个微信的效果。相比于使用虚拟机的方法,本方法更简单易行,适用于任何电脑,并且不会消耗过多系统资源。详细步骤和原理解释请参考本文内容。 ... [详细]
author-avatar
顾凡人_479
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有