dos2unix与unix2dos之学习记录
1. unix2dos与dos2unix这两个tool是用来干什么的?
这首先应该要说明一下背景知识:
unix类操作系统下,换行字符是\n;
而早期的dos操作系统,其换行字符是由\r\n组成。
所以如果将unix系统下的文本文件copy到dos系统下
或者将dos系统下的文本文件拷贝到unix下可能会存在问题。
所以就出现了unix2dos以及dos2unix这两个tool。
2. 为什么早期的操作系统换行需要用\r\n两个字符来表示?
关于这个历史就当是看故事吧。
在计算机出现之前,有一种叫做电传打印机的设备,每秒钟打印10个字符,
但是当一行打印结束,需要换到下一行时,需要耗时0.2s做换行回车的动作
将打印机指向下一行起始位置。而如果在这过程中有新的字符传过来,
则该新字符就会丢失。那为了解决这个问题,研究人员就想到了在回车换行的
过程中多打印\r\n这两个不会影响到显示的字符来解决可能存在的字符丢失问题。
而随着计算机的发展,科学家发现用\n一个字符即可达到这种换行回车的目的了。
3. linux系统下的文本文件直接copy到windows下面显示只会显示出一正行长长的字串?
这个目前我也不确定,需要通过实验以及更丰富的理论知识来确认。
如果有知道的朋友,也可以跟我讲喔,谢谢。
4. 所以dos系统下文本文件的size要比unix系统下文本文件的size要小?
毫无疑问,在二者显示内容完全相同的情况下dos系统文本文件每一行都会多一个\r字符。
5. unix2dos源代码应该如何实现?
综上所讲,我们知道unix2dos其实很简单的就是在每一个\n字符前面不上\r字符。
假设unix2dos这个tool的用法是:
./unix2dos ./unix_file ./dos_file
那伪代码过程基本如下:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
fp_unix = fopen(argv[1], "rb");
fp_dos = fopem(argv[2], "wb");
while(!feof(fp_unix))
{
char = fgetc(fp_unix);
if (char != '\n')
{
fputc(char, fp_dos);
}
else
{
fputc('\r', fp_dos);
fputc(char, fp_dos);
}
}
}
6. dos2unix源代码应该如何实现?
dos2unix的代码实现很类似,区别在于如果连续的两个字符分别为\r,\n,
则需要将\n之前的\r字符删除掉。所以网上有朋友写了类似的程序将文件
中所有的\r字符删除是不正确的,因为\r可能是用户特定有用的字符。
部分代码如下:
while(!feof(fp_dos))
{
char1 = fgetc(fp_dos);
char2 = fgetc(fp_dos);
if (char1 == '\r' && char2 == '\n')
{
fputc(char2, fp_unix);
}
else
{
fputc(char1, fp_unix);
fputc(char2, fp_unix);
}
}
以上代码并未做诸多参数有效性检查,出错处理等,仅供参考。
dos2unix与unix2dos之学习记录的更多相关文章
- Quartz 学习记录1
原因 公司有一些批量定时任务可能需要在夜间执行,用的是quartz和spring batch两个框架.quartz是个定时任务框架,spring batch是个批处理框架. 虽然我自己的小玩意儿平时不 ...
- Java 静态内部类与非静态内部类 学习记录.
目的 为什么会有这篇文章呢,是因为我在学习各种框架的时候发现很多框架都用到了这些内部类的小技巧,虽然我平时写代码的时候基本不用,但是看别人代码的话至少要了解基本知识吧,另外到底内部类应该应用在哪些场合 ...
- Apache Shiro 学习记录4
今天看了教程的第三章...是关于授权的......和以前一样.....自己也研究了下....我觉得看那篇教程怎么说呢.....总体上是为数不多的精品教程了吧....但是有些地方确实是讲的太少了.... ...
- UWP学习记录12-应用到应用的通信
UWP学习记录12-应用到应用的通信 1.应用间通信 “共享”合约是用户可以在应用之间快速交换数据的一种方式. 例如,用户可能希望使用社交网络应用与其好友共享网页,或者将链接保存在笔记应用中以供日后参 ...
- UWP学习记录11-设计和UI
UWP学习记录11-设计和UI 1.输入和设备 通用 Windows 平台 (UWP) 中的用户交互组合了输入和输出源(例如鼠标.键盘.笔.触摸.触摸板.语音.Cortana.控制器.手势.注视等)以 ...
- UWP学习记录10-设计和UI之控件和模式7
UWP学习记录10-设计和UI之控件和模式7 1.导航控件 Hub,中心控件,利用它你可以将应用内容整理到不同但又相关的区域或类别中. 中心的各个区域可按首选顺序遍历,并且可用作更具体体验的起始点. ...
- UWP学习记录9-设计和UI之控件和模式6
UWP学习记录9-设计和UI之控件和模式6 1.图形和墨迹 InkCanvas是接收和显示墨迹笔划的控件,是新增的比较复杂的控件,这里先不深入. 而形状(Shape)则是可以显示的各种保留模式图形对象 ...
- UWP学习记录8-设计和UI之控件和模式5
UWP学习记录8-设计和UI之控件和模式5 1.日历.日期和时间控件 日期和时间控件提供了标准的本地化方法,可供用户在应用中查看并设置日期和时间值. 有四个日期和时间控件可供选择,选择的依据如下: 日 ...
- UWP学习记录7-设计和UI之控件和模式4
UWP学习记录7-设计和UI之控件和模式4 1.翻转视图 使用翻转视图浏览集合中的图像或其他项目(例如相册中的照片或产品详细信息页中的项目),一次显示一个项目. 对于触摸设备,轻扫某个项将在整个集合中 ...
随机推荐
- [每日一题] 11gOCP 1z0-052 :2013-09-14 repeated parsing activity.................................A70
转载请注明出处:http://blog.csdn.net/guoyjoe/article/details/11699299 正确答案:D SQL语句的执行过程: 1.客户端输入sql语句update ...
- log4j:ERROR Could not find value for key log4j.appender.error
我是在rootLogger末尾增加R就好了. 终于我的配置环境例如以下: #设置日志的级别 ,多个以,分开(没有给出的,则不会被输出) log4j.rootLogger=info,error,R #D ...
- Linux 多线程通信
摘自资料(linux 与Windows不同) 线程间无需特别的手段进行通信,由于线程间能够共享数据结构,也就是一个全局变量能够被两个线程同一时候使用.只是要注意的是线程间须要做好同步,一般用mutex ...
- android代码实现关机
1.API没有开放,需要提升为syetem app级别! 2.android 模块编译,mm 命令 2.1.先进入顶层 source build/envsetup.sh 2.2.进入目录 m ...
- C# 中根据datetime的值来计算属于本年的第几周,类似delphi中的weekoftheyear功能
/// <summary> /// 获得今天是今年的第几周 /// </summary> /// <param name="year">< ...
- ThinkPHP - CURD增删改查操作
public function show(){ //使用model模型 //1.可以使用 $user = new Model('User'); //2.可以使用 $user = M('User'); ...
- 【Oracle】不安装Oracle客户端直接用PL/SQL连接数据库
1.下载 instantclient_11_2.zip PL/SQL2.解压instantclient_11_2.zip到相应文件夹,比如:E:\oracleclient\instantclient_ ...
- 【Eclipse】Tomcat 改变发布路径
关闭服务,删除里面的所有项目,clean,然后双击服务,发布路径修改就可以点击了.当重新发布了项目后,发布路径修改的按钮又会恢复不可点击状态.
- 百度SiteApp构建网站APP
现在很多个人网站和企业网站都是传统的Web方式,有没有想过个人/企业网站也能做成APP应用对外宣传呢?专门找人去开发Android和IOS上的APP又太贵,为了赶上移动互联网时髦,我以个人网站试做了一 ...
- 10个值得我们关注的python博客
大家好,还记得我当时学习python的时候,我一直努力地寻找关于python的博客,但我发现它们的数量很少.这也是我建立这个博客的原因,向大家分享我自己学到的新知识.今天我向大家推荐10个值得我们关注 ...