[浅出 PHP] PHP 文件操作 写文件
什么是浅出?#
就是用最简单的话,来解释最简单的事儿。
fwrite 函数#
写入文件(可安全用于二进制文件)。
老铁你好奇什么是二进制安全吗?php-src 这个项目是 c 语言写的,在 c 语言中,是没有字符串类型的。c 语言实现的字符串是用 char 数组,然后以 '\0' 作为字符串的结束。所以读到了 '\0' 的时候,就结束了不读了。但是在 php 中,读到了 '\0' 却没有结束。这就是二进制安全。
老铁你好奇在 php-src 是怎么实现二进制安全的?php 的字符串实现,把字符串的长度 (len) 记录了。
读的时候按照长度来读,就二进制安全了。
fwrite 的参数#
handle#
文件系统指针,是典型地由 fopen () 创建的 resource (资源)。
这里忍不住唠叨一下,有些翻译把 handle 翻译为句柄。这个专业术语,好难懂!!!
但是我结合上下文,把句柄理解为入口的意思。各位大神,你们怎么看?
文件系统指针,指针是什么?指向一个变量的内存地址。(是不是很浅出?)
string#
要写的字符串。
注意哦,这个字符串很安全噢,因为这是个二进制安全的 fwrite。(这句话忽视吧)
length#
如果指定了 length,当写入了 length 个字节或者写完了 string 以后,写入就会停止,视乎先碰到哪种情况。
这下面是英文文档,上面是官方手册的中文翻译,我复制的。
If the
length
argument is given, writing will stop afterlength
bytes have been written or the end ofstring
is reached, whichever comes first.
fwrite 的返回值#
fwrite() 返回写入的字符数,出现错误时则返回
FALSE
要不浅出的看下源码?#
既然是浅出,我就很浅的看了一下变量啊。
char *str; //这是要写入的字符串
size_t str_len; //这是字符串的长度
zend_long length = 0;
ssize_t written; //这是返回的写入字符数
老铁你好奇,为什么 written 不等于 str_len 吗?因为 fwrite 的第三个参数是可以指定要写入的字符串长度的。我字符串如果长度 10,但是 length 是 3,写入成功的情况下是返回 3 的。
老铁你好奇,为什么字符串长度是 size_t,而返回的长度是 ssize_t 吗?size_t 是无符号的,ssize_t 是有符号的。size_t 不会给你返回负数,因为一个字符串长度永远不可能是一个负数。那么返回的字符数为什么是有符号的啊?刚才说了 c 语言没有字符串类型,c 语言有的东西太少了。布尔类型 c 语言也没有的,所以很多时候就用负数来代表 false 了。注意哦,fwrite 的返回值再出错的时候要返回 false。
老铁你好奇,别好奇了,
申明#
以上信息不保证完全正确,因为是人都会犯错。不过很乐意各位大佬指点,谢谢。
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: