zoukankan      html  css  js  c++  java
  • Windows读写文件的猫腻

    这里主要涉及对于回车换行的讨论。

    回车:

    换行:

    Windows读写文件分为普通文件读写和二进制文件读写。

    如果以二进制的方式读写文件(如rb, wb),将会完全的把文件内容读出来,不做任何处理。

    而如果以普通方式读写文件,会对文件做一些处理,而我所了解的只有一点,就是对回车符与换行符的处理。

    首先我建了4个文件:r.txt     n.txt     rn.txt      nr.txt

    r.txt的内容:hello world(注' '表示一个字符,回车符)

    n.txt的内容:hello world(注' '表示一个字符,换行符)

    rn.txt的内容:hello world(注' '表示两个字符,回车符和换行符)

    nr.txt的内容:hello world(注' '表示两个字符,换行符和回车符)

    然后,我用普通方式读文件 fp = fopen(name, "r");

    r.txt中读到的内容:hello world,没变

    n.txt中读到的内容:hello world,没变

    rn.txt中读到的内容:hello world,改变了,少了' '

    nr.txt中读到的内容:hello world,没变

    得出结论:在以普通方式读取文件时,Windows只对' '(注意是连续的两个字符,而且就是这个顺序)做处理,

    处理的结果是撇掉' '只留一个' '。

    然后,我又把四个文件都清空,用普通方式写文件 fp = fopen(name, "w");

    r.txt:fprintf(fp, "hello world");

    n.txt:fprintf(fp, "hello world");

    rn.txt:fprintf(fp, "hello world");

    nr.txt:fprintf(fp, "hello world");

    最后我用文本编辑器(SublimeText)以十六进制形式查看这四个文件,

    r.txt中实际写入的内容:hello world,没变

    n.txt中实际写入的内容:hello world,' '被扩展成了' '

    rn.txt中实际写入的内容:hello world,' '被扩展成了' '

    nr.txt中实际写入的内容:hello world,' '被扩展成了' '

    得出结论:在以普通方式写文件时,Windows自动将' '字符扩展成' ',

    所以如果你这时再以fprintf(fp, "hello world");这种方式向文件中写数据,就会多写一个' ',

    虽然' '是不可打印字符,我们看不见,但它确实被写到文件中了,而且有些编辑器会检测到这个多出来的' ',

    从而以特别的方式显示出来,很是有碍观瞻。现在知道了原理,相信你也能很轻松的解决这种问题了。

    补充:由于历史原因,Windows,linux,Mac OS三大平台对于换行的表示(这里说的是在文本文件中的表示)很不统一,

    Windows的正规表示法是' ',即用回车符+换行符来表示换行,

    Linux的表示则比较简洁,只用一个' '换行符就够了,

    Mac也很简洁,但它是用一个' '回车符来表示换行。

    好在代码编辑器都比较智能(如SublimeText),对这三种换行形式都能正确地识别出来。

  • 相关阅读:
    Attach Files to Objects 将文件附加到对象
    Provide Several View Variants for End-Users 为最终用户提供多个视图变体
    Audit Object Changes 审核对象更改
    Toggle the WinForms Ribbon Interface 切换 WinForms 功能区界面
    Change Style of Navigation Items 更改导航项的样式
    Apply Grouping to List View Data 将分组应用于列表视图数据
    Choose the WinForms UI Type 选择 WinForms UI 类型
    Filter List Views 筛选器列表视图
    Make a List View Editable 使列表视图可编辑
    Add a Preview to a List View将预览添加到列表视图
  • 原文地址:https://www.cnblogs.com/liubaocheng999/p/3577364.html
Copyright © 2011-2022 走看看