缘起
string fgets ( resource $handle
[, int $length
] );
第二个参数指定可以读取的最大长度,但是比较有意思的是,如果最终没有读取到换行,则返回的不是$length个字节,而是 $length -1 个字节,文档是这么写的,事实也是这样子的,那么为什么制造这么一个小插曲呢?说多少就是多少不是很好嘛,为什么还要少一个字节呢?
分析
因为PHP是用c写的,这可能也不是PHP故意如此的,或许C就是这样的,于是:
man fgets
…
fgets() reads in at most one less than size characters from stream and stores them into the buffer pointed to by
s. Reading stops after an EOF or a newline. If a newline is read, it is stored into the buffer. A ‘\0’ is
stored after the last character in the buffer.
…
看来这和字符串buffer的长度是有关系的,字符串总是要以”\0″(是零不是欧)结尾的,所以真正得到的长度比指定的长度是小1的。
如果一行是3个字符(带上换行),这时候,指定fgets的最大长度为3,则读不出来换行,只能读到2个字符,写一次才能读到换行