A.一张JPEG图片- b" T& r* t) r: K
B.一个二进制文件8 i( `* G; V/ S9 i
C.下载一个二进制文件 |9 e6 e& C3 s: M0 `* jD.下载一张JPEG图片0 c, C1 I) b' D1 _
E.一张残破的图片' c$ J* z. X$ Q) ]% A: V: ^( L$ K
$ A) F6 n- x' @& Q# W' V4 W6 o: \4 V+ g* T
, I- A/ B9 L- R) N- G& g答案速查:% f8 i) |( d0 ~: L$ ^; `/ b4 n
1:D$ {% b- n$ P+ @: P" k' j) h) P% y
2:fclose()4 w, U# e+ A6 r+ @
3:D 0 s$ Z' t. b/ @$ B8 \' h2 S4:D- E+ U, v/ j- P/ y) u: ^
5:AD $ m. b: K5 V" S* i4 A( w6:C $ ^& [, `! w6 Y) N9 F$ s$ J7 Y7:E " A( ?; R! q2 V8:E4 U( N. A1 y, e
9:C 4 F1 P; B6 j4 v$ r- B" _10:A ' m! j/ d6 i6 d: K( @' V# Y11:BD & b' l5 X4 A( A4 G; v; y12:fopen() ) @2 e5 [" E! t+ f7 R' u& Z13:BDE6 o+ ^! |* I y% k' z
14:fwrite(), fputs() + r9 {# A. Q/ b' f, Q% o+ s15:A0 R7 z2 _9 |- U; [1 X% {: P4 V
16:is_writeable() 3 F# ` F$ g8 `17:D 2 D; O% Z) [4 |' ]18:B # a6 N7 {+ A; `3 a. R" i19:B 2 q; K- w% h. [7 N20:E# R) D+ P1 x+ |: m* E3 l
' E3 i/ O. H% h# |4 }" r
* C& o ?5 C6 j( n6 l$ O+ J* B, f
答案详解2 S* B3 p, |0 n. J
. D8 \5 d" c }9 O# ]9 w
1.fgets函数主要用来从文本文件中读取一行,当然你也可以指定每次读取的最大长度。fread函数主要用来读取二进制数据。答案是D。 G6 w0 ^# R, x# V ; M8 Z+ T6 c4 U$ c: o& w2.函数fclose能关闭文件指针。 ( A3 `. E- a. N* Q( ~( \: D1 F3 A$ n, O. i# H1 g* L
3.fgets函数能从文件中读取单独一行。因此答案是D。9 m; j% g# u% h1 z& V
0 V# l/ L' L" a4.正确答案是D。这题很难,而且在实践中不大可能会碰到这样的问题——但这不正是你读这本书的原因吗?!你必须记住,flock()使用一种“协议”锁定机制,即所有其他访问此文件的进程也必须要使用flock()。如果某个进程没有这么做,竞争就会产生,锁就不安全。用mkdir创建一个文件夹能保证任何时刻只有一个进程处理能处理某文件,即保证操作的原子性。因此,你可以创建一个临时文件夹并“护”住它,直到I/O操作完成。 9 D3 L$ p5 L' P# `& z2 Q/ b ( h8 D$ L7 @ |6 ~0 V, V* [% F5.只有file_get_contents和file函数返回文件的全部内容,因此答案是A和D。readfile函数也能读取文件的全部内容,但它直接把内容送入了输出缓存,因此不能用在表达式中。# ~# {( g$ ?% }( M$ D* ?2 i, U
! O1 _0 N0 j, k( \4 i& @6.fscanf函数能根据指定格式解析文件内容,因此答案是C。sscanf函数只能用来操作字符串。( `& s* a! ~# h; p7 Z( D
: o# K5 g* U" i6 `! S: s- M+ @% @
7.答案是E。注意,文件被以r模式打开,即只读模式。因此,如果文件不存在,PHP将输出一个错误来指出没有找到文件。如果文件存在,fopen()将被成功调用,但由于是以只读方式打开,fwrite()会失败。如果我们用w代替r,脚本就能正常运行,并且myfile.txt内将有50个随机字符(记住,可以像访问数组那样使用索引来访问字符串)。 B' F' h# n3 T; d
$ ]4 y+ }% P! U ^- d8.答案是E。PHP里没有叫delete()的函数。删除文件用unlink(),删除文件夹用rmdir(),数据库记录用SQL语句删除,释放变量用unset()。 ( o; d& R6 u8 |4 A! U% L: u7 f2 i/ M5 L6 z1 l: N3 ~7 @
9.脚本实现的功能与file_put_contents()最接近,但这个函数直到PHP5才被引入,因此答案是C。" E) u% Z6 y# B w( R. l
7 v* @- F' C# x0 \5 a10.PHP4.3.0开始,php.ini引入了auto_detect_line_endings设置,系统在保存文本文件时能够自动侦测行结束符号的类型,因此答案是A。3 D& a! j7 I0 J3 ~' ^# y [2 G, M1 G
5 N( W( e# E; n6 P P11.要可读可写的打开文件,你必须使用r+模式,因此答案是B和D。* u5 }6 k B& W' R
* Q9 k5 ?2 W" i, Y! O6 M7 O9 h8 ~
12.这是在说fopen()函数。' p% l. K0 U, X+ U: `0 d
5 r: ]% a# G" {5 v
13.正确答案是B,D和E。file,readfile和file_get_contents都能读取文件的全部内容。. M1 L p( s3 |& D1 s7 b% [
- S- d2 N; V* _14.fwrite()和fputs()两个函数在这里都可以,而后者其实是前者的别名。在PHP中,写入二进制数据和写入字符串没有区别。 - d9 P# {# D$ ^! {0 Q+ h, O" }3 F1 H. E( r& e+ R; n% K
15.PHP会缓存某些文件系统函数的返回值——包括file_exists(),这样能提高脚本处理重复操作时的效率。当脚本里有大量删除文件的操作时,缓存很容易就会过时,因此需要清理缓存。答案是A。8 j. g9 I: |& A* T4 X8 k
4 [: }* {6 K/ h/ c+ ^( U8 ]6 b, U
16.这是在说is_writeable函数,它返回一个表示文件是否可写的布尔值。 * N8 I' c& ^/ _. _% f- C2 X L, J+ v8 j3 u
17.正确答案是D。fseek()用来移动文件指针。SEEK_SET指出偏移量从文件开头开始计算。如果没有特别指出,SEEK_SET就是fseek()的默认模式。注意,rewind函数等效于fseek(0,SEEK_SET)。 ' [. t5 u, @5 L& Y, n+ G5 R% f 5 M" j ^, L S. J4 F" n0 \, _, \18.答案是B。fstat函数通过已打开的文件指针取得文件信息,stat()获取指定路径的文件信息。 3 @5 T% R5 |5 ~2 P, G" w. H& K, W. \1 S9 J' O3 P6 _7 m
19.正确答案是B。disk_free_space函数能确定指定设备上(本题中即Windows下的C盘)的剩余磁盘空间(单位是byte),而disk_total_space()能确定设备的总容量。两者相除,再乘以百分率,最后用number_format()保留两位小数,脚本输出的就是剩余磁盘空间所占的比例。最后在加上百分号以防混淆。" }9 X1 l) @ |9 A2 H' r, R$ k
7 E! _+ x m# C4 O. D) Z }# p, V" c20.答案是E。你注意到两个代码块之间的空行了吗?它将被输出到浏览器上,使得整个图片的二进制数据出错。因此浏览器将显示一个破碎的图片(或者是一条信息,指出图片出错)。(译者注:原文中两个代码块之间并没有空行,而在我添加了空行之后,也没有调试出答案中描述的情况。)