我正在研究Ubuntu 16.我发现编辑器会在文本中写入额外的字节(UTF-8)。当我试图通过测试时,它给我带来了一些问题。
因此我们在UTF-8中使用大小为10字节的字符串“Extra byte”。 例如,当我尝试用gedit在文件中写入时,我得到的文件大小= 11字节。纳米也是相同的尺寸。甚至“echo”Extra byte“> filename”返回11个字节。
然而,当我们尝试像这样的时候:
#include <fstream>
int main(){
std::ofstream file("filename");
file<<"Extra byte";
return 0;
}
或者这个:
with open("filename_py",'w+',encoding='UTF-8') as file:
file.write('Extra byte')
我们得到size = 10字节的文件。为什么? 谢谢。
答案 0 :(得分:1)
许多编辑器(包括gedit和nano)都有一个功能,可以在文件末尾添加换行符。 std::ofstream
没有此功能,因为它用于编写非文本文件和文本文件。
该功能的存在是因为POSIX定义的文本文件由行组成,根据定义,行以换行符结束。
3.206行
一系列零个或多个非
<newline>
字符加上终止<newline>
字符。3.403文本文件
包含按零行或多行组织的字符的文件。这些行不包含NUL字符,并且任何行都不能超过{LINE_MAX}个字节,包括
<newline>
个字符。尽管POSIX.1-2008不区分文本文件和二进制文件(请参阅ISO C标准),但许多实用程序在操作文本文件时仅产生可预测或有意义的输出。具有此类限制的标准实用程序始终在其STDIN或INPUT FILES部分中指定“文本文件”。
答案 1 :(得分:1)
您看到newline character(通常用编程语言表示为\n
,ASCII格式为十六进制0a,十进制10):
$ echo 'foo' > /tmp/test.txt
$ xxd /tmp/test.txt
00000000: 666f 6f0a foo.
hex-dump tool xxd
显示该文件由4个字节组成,十六进制66(ASCII小写字母f),两次十六进制65(小写字母o)和换行符。
您可以使用-n
命令行开关禁用添加换行符:
$ echo -n 'foo' > /tmp/test.txt
$ xxd /tmp/test.txt
00000000: 666f 6f foo
或者您可以使用printf
代替(符合POSIX标准):
$ printf 'foo' > /tmp/test.txt
$ xxd /tmp/test.txt
00000000: 666f 6f foo
另见'echo' without newline in a shell script。
大多数文本编辑器还会在文件末尾添加换行符;如何防止这种情况取决于确切的编辑器(通常你可以在保存之前使用文件末尾的删除)。事后还有各种命令行选项可以删除换行符,请参阅How can I delete a newline if it is the last character in a file?。
文本编辑器通常会添加换行符,因为它们处理文本行,而POSIX标准定义了text lines end with a newline:
3.206行
一系列零个或多个非<newline>
字符加上终止<newline>
字符。