返回列表 发帖

[Zend权威认证试题讲解]第六章 - 文件操作

你可能觉得PHP的文件操作功能并不怎样,但实际上它对开发者来说非常有用。即使你是做网站开发的,学会相关技能也能让你如虎添翼。多亏了流包装器(stream wrappers,将在第十章详细介绍),PHP才能够打开并读取远程文件,让在本地使用第三方网站的内容变得可能。
0 Z) Y) J- G) D4 _: E站在更底层的角度,文件输入/输出能完成多种任务。可以用他读取预制文件的内容,比如第三方提供的内容;或者通过PHP脚本让浏览器打开一个二进制文件,使得你能更切实的控制它。无论如何,本章不仅考验你打开、关闭和读取文件的能力,还考查多进程下进行文件操作的基础知识——例如文件锁。9 |+ u6 j* q& b: p3 o  K/ b

, ]$ s& ^# U- k+ n' V" u/ ^( x: }, q  Z3 v3 @$ r1 z
问题
) N9 V) Q+ s" |" X; ~- t( ~5 s% H; D# ]+ J
1.函数______能读取文本文件中的一行。读取二进制文件或者其他文件时,应当使用______函数。! J0 f5 D/ s; m

3 z, U6 z' t, C0 a. i- wA.fgets(), fseek()6 T, g" ^$ K- t. A- Z" t2 o
B.fread(), fgets()" ]* z) }- j' T; |
C.fputs(), fgets()
: v0 x& v9 k0 ^9 t5 s. {" XD.fgets(), fread()
& }" Z& {1 \6 x' l$ {E.fread(), fseek()2 W9 {) Z. j% A1 q

( N, C/ U" {' Y4 n4 T
. d$ j6 F0 c; w- U) t2.文件指针能在PHP脚本结束时自动关闭,但你也可以用______函数来关闭。. E( u- Y) ?, l* s+ Q
! z7 ]8 |0 V! M/ o! J
答案:____________" ?$ V+ O  P2 Y* ~" S

! m9 q+ Q1 w1 h- u' q. \
1 J5 H% n6 K4 B3 p3.考虑如下PHP脚本,它一行一行的读取并显示某文本文件的内容。在问号处填入什么才能使脚本正常运作?

  1. <?php
  2. $file = fopen("test", "r");
  3. while(!feof($file)) {
  4. echo ????????????;
  5. }
  6. fclose($file);
  7. ?>
复制代码
A.file_get_contents($file)
4 J' t- F2 @6 e) M; V2 wB.file($file)
0 Z+ Q" B, Q) B7 a& b6 ~5 h5 AC.read_file($file)
! ]7 m3 s6 k: E% ^/ [. dD.fgets($file)
& i1 M. r7 L/ R' _E.fread($file); [1 C$ U4 u  L  e' R

+ }" R6 X; f. k' l! G! g/ N! i
4.以下哪种方法能保证锁在任何竞争情况下都安全?" J$ I' U/ x/ {
  ?- B) @7 X6 }) C. S1 z2 l4 \* s. ]  O
A.用flock()锁住指定文件& ~2 n/ Y  B) z8 |) f! M3 S
B.用fopen()在系统的临时文件夹里打开文件
8 x& k% z* h. m( |: {' h  IC.用tempnam()创建一个临时文件( B1 {/ X! P5 O8 k8 _6 s8 D4 e
D.用mkdir()创建一个文件夹来当
9 t5 h  k" x% e, t$ _+ B( ]E.用tmpfile()创建一个临时文件; e: _, U3 j' P  J/ P1 c
5 a' [$ C3 I( f4 K  C' m/ ]
- P7 N* D1 l% E+ o: r
5.以下哪个函数能够获得文件的全部内容,并能够用在表达式中?(双选)
+ d* G$ Z# g" P8 u" I5 B
9 p9 }: B. N8 T* `A.file_get_contents()* R1 w$ r# F2 Y2 L3 d# l
B.fgets()2 |( _- D# v6 |; C* c6 w7 I, }; }; {# x' T
C.fopen()
! ?" z' B' u1 kD.file(); O2 V2 Z3 q" D9 t5 `& M
E.readfile()
2 w$ r; T4 o5 _6 W3 b  H4 A  _6 L
/ Z8 M+ o9 Q' @$ c: ?+ a" ^+ k% ^4 ]
6.在不把文件内容预加载到变量中的前提下,如何解析一个以特殊格式格式化过的多行文件?9 E" [2 S4 Y4 N

# x' b- b! Y4 z) [A.用file()函数把它分割放入数组$ ?* M! l' n/ {5 m; ]
B.用sscanf()2 E8 r4 h8 {4 u8 p: j% y
C.用fscanf()
$ \- c: K1 l! m# aD.用fgets()4 p: ^& j  Z: k% u2 b! D0 s' D. w! \. B  V
E.用fnmatch()  U! R7 z. C+ |3 A4 i) e
7 [2 F- ~  R0 [  O5 ~" u
# f2 Q3 U* u# X* s( U
7.考虑如下脚本,最后文件myfile.txt的内容是什么?

  1. <?php
  2. $array = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  3. $f = fopen ("myfile.txt", "r");
  4. for ($i = 0; $i < 50; $i++) {
  5.                 fwrite ($f, $array[rand(0, strlen ($array) - 1)]);
  6. }
  7. ?>
复制代码
A.什么都没有,因为$array实际上是一个字符串,而不是数组! q+ ?  H& ~, [+ N
B.49个随机字符
' f/ |7 W& g4 E  f3 x# f8 r; C5 DC.50个随机字符& X0 S" w- G% K+ W. I6 W* p
D.41个随机字符
; h2 M: F8 i9 v+ ~1 x5 P) LE.什么都没有,或者文件不存在,脚本输出一个错误
/ X1 h/ K0 D* O+ v# \- `1 k
+ p- P7 `+ ~( {/ K" D
. H$ G1 q4 l: M8.函数delete是做什么的?1 u  A% M5 N4 u

! W* p( E/ H* u) {$ L: MA.删除文件
7 w9 j+ h+ Q% d9 WB.删除文件夹( H  X% j9 |( Y. ]+ y7 @, g
C.释放变量" ~( }% \, h% ]. a6 ?
D.移除数据库记录
5 _0 p$ U. m4 k! F* n  O8 NE.没有这个函数!& E4 d2 ]1 }, C' U  e" X9 \

5 ]& ~6 b2 ]0 `1 G- n, M
$ K  P$ z6 q+ z+ X+ v% Q- T% F, ~  b' a9.考虑如下脚本,哪个PHP函数和它的功能最接近?

  1. <?php
  2. function my_funct ($file_name, $data)
  3. {
  4.         $f = fopen ($file_name, 'w');
  5.         fwrite ($f, $data);
  6.         fclose ($f);
  7. }
  8. ?>
复制代码
A.file_get_contents()5 v% L. ?" P" u  w. s) e+ b/ `
B.file_put_contents()# g! b. T8 D: ?" E; [% J$ F. @5 u
C.没有这样的函数
# j/ j5 R( b7 y2 w' J$ }D.file(). e" P# z) |* f
E.fputs()( q- E3 l& p3 ]
& G3 ?% t2 j) x/ U! X  r
/ e. R, n/ d; ^! `, h
10.如果你的脚本无法正确识别一个存储于另一个平台上的文件的行结尾,你该怎么办?% [' z# a/ C; M$ M" R

! J  y8 X; n; U7 L6 N, Q- yA.改变auto_detect_line_ending的设置9 u% C; R% Y  o0 Q' i3 _7 [3 N3 {
B.用正则表达式侦测行的最后一个字母# k* O. g0 K6 k1 @( E+ M
C.用fpos()/ l/ U1 {1 g4 s7 K6 B1 |
D.用ftok()3 T& q6 d% i% s& |% M
E.每次读取一个字符) ?- e" J# Z' E. o# {

  u/ H- O! k7 M( ?8 q8 g( Y# \0 T/ {' w+ ]7 \% t
11.如果想要可读可写得打开一个文件,该给fopen()传什么参数?(双选)
2 ~/ W3 H* X% o4 P  s
' F, u1 C0 h9 c8 C3 N( O, dA.w" _. e+ `! [9 n! y* \
B.r
% R& m$ w* h$ d2 I+ _0 yC.a
* w4 _, T( R# q( ]$ }D.+
8 ~3 o2 B- j: M3 L4 s  f1 r8 {8 h' U; O! g! R# @& `

) [/ ^1 H5 p: {  M8 d12.能够读写常规文件中的二进制数据的函数是______,该函数返回的资源能被fgets()使用。6 f! t. I) O  }# ]5 ~

% f6 W8 j# _. {1 W# y答案:__________
1 u5 E% m; A$ Y
; s" m( ]0 f7 g4 P& [8 R' L% ~/ C6 ?$ G' `# c
13.以下哪些函数能读取文件的全部内容?(三选)( f. J+ d5 V/ X' R
4 a# r: [5 o+ a. s: c3 F
A.fgets()
& ?7 w4 ?0 Z! e4 F& E/ jB.file_get_contents(): t: B# g, G0 Q2 ]# N; {4 C! a
C.fread()
( n! A; t3 x2 MD.readfile()
$ }# q4 U& ~' KE.file()
. @2 m! d  x! g+ i: G) I  k& O) r7 I. }' O5 f; n# a- l. n: k
* J- Q- ]8 d& |0 C) E
14.哪个函数能够往文本文件中写入一个字符串?
3 I5 F8 A! i8 _. W4 |  D/ s8 u' G9 _( |0 R6 p- Y' ?. f
答案:____________( x8 k. v6 j. P+ @& ^2 ?4 K4 ?
3 ^& N  y* H# C3 B0 @6 `0 U0 a5 X

3 P- `& S' o! a$ ~, l% ~) |1 c0 A5 n15.考虑如下脚本。运行时,尽管文件test.txt已经被用unlink()函数删除,脚本仍然输出1,1。在脚本的最后添加什么函数才能解决这个问题?

  1. <?php
  2. $f = fopen ("test.txt", "w");
  3. fwrite ($f, "test");
  4. fclose ($f);
  5. echo (int) file_exists("test.txt") . ', ';
  6. unlink ("c:\\test.txt");
  7. echo (int) file_exists ("test.txt");
  8. ?>
复制代码
A.clearstatcache()0 n7 p* a" q  @, j1 p; @; t" s: @% V+ P
B.fflush()+ l) w; T' I! C9 ?$ ^
C.ob_flush()
' V' _$ B9 H; ED.touch()
2 E3 Q1 n- H6 @+ s4 lE.以上都不对
& I4 ]) `+ n* a, f. R& _; P; Q$ b" ?8 q% T, @2 Y

- n9 h' D/ n8 r' F/ a" }16.函数______能判断一个文件是否可写。
$ o3 y* q# Y3 h+ X& f# \& p- {% b0 o  H3 u8 n' ^
答案:____________
. c2 z6 C- j. Y1 x0 H$ `* \8 e; X. [" x8 l" v% I
; c/ ~: _/ W+ U6 y& a: `
17.以下哪个选项能将文件指针移到开头?
6 T1 A+ J' M6 r- p! C, u: e' k3 `5 n1 X% z$ v( |7 H
A.reset()
3 l8 `5 \6 n$ g% W" t) EB.fseek(-1)
+ E5 [8 n! f9 z' \C.fseek(0, SEEK_END)
8 E" |( c' M, n. }: c& w! fD.fseek(0, SEEK_SET)
& Y% Y  M" c2 r4 y0 }9 dE.fseek(0, SEEK_CUR)4 a6 U3 }) k: }0 |  s" K$ R  _- A

+ x5 _6 v1 a3 O. s
6 C; z& l2 p9 I/ A. w& b7 r18.stat()和fstat()有什么区别?
) f& G3 J, I' c1 Z; Q9 R4 P3 Q. E4 D1 z' u; I& q8 W
A.stat()基于文件指针工作,fstat()基于路径工作
- F$ u" v1 Y$ R1 o6 XB.fstat()基于文件指针工作,stat()基于路径工作
6 f# q* i( k. ~: y4 yC.fstat()不能处理文件
3 E% Y  s! x5 m% kD.stat()不能处理文件
9 ]$ r/ U2 V( RE.fstat()是stat()的别名
; q% v) w  d0 }5 [+ S
: Z2 }) R0 m/ u. ~4 H4 ?& m/ m) V2 Z3 @" d; X. i0 [, S; }; ]
19.以下哪个选项准确的描述出了方框中的脚本的作用?

  1. <?php
  2. echo number_format (disk_free_space ('c:\\') /
  3. disk_total_space('c:\\') * 100, 2) . '%';
  4. ?>
复制代码
A.计算Windows系统C盘的剩余磁盘空间大小/ g6 o0 B' u2 z1 X* B; m
B.输出一个表示C盘剩余空间所占比例的两位小数
& E. {  D% _  p) }$ JC.输出C盘剩余容量的byte数: K% B* e5 J" x- S8 Q
D.计算C盘总容量与剩余空间的比率
3 L- F1 _& |! EE.以上都不对
1 M# N& B5 \6 o7 U2 ]
  V2 l0 a5 M# U; I
$ j6 c/ x  d' x, D7 M* z' m20.假设image.jpg存在并能够被PHP读取,调用以下脚本时,浏览器上显示什么?

  1. <?php
  2. header ("Content-type: image/jpeg");
  3. ?>
  4. <?php
  5. readfile ("image.jpg");
  6. ?>
复制代码
A.一张JPEG图片
6 Q  m2 n1 U8 c. ]B.一个二进制文件& L. ?* C. K" R4 E5 H% G' F% p' Q
C.下载一个二进制文件
4 e" T6 A7 ?' ~& Y; f# o6 YD.下载一张JPEG图片
, M/ ~4 M. J1 gE.一张残破的图片
) l1 y- w$ A, z* U& }' Y* @7 M% q) B

: r6 _$ i# B' |2 w8 V! o8 m: k6 E8 F& w* X& R8 l' L. q) [' X8 `
答案速查:5 o1 E& S. F* Z& l9 @' N  y
1:D9 g) |: A! H6 `' a" l
2:fclose()% S- Q; G/ ~8 f* i3 ~6 l! [
3:D  e8 I0 C" r5 v0 j1 {: s, d
4:D
7 e  J0 I& v/ w% a0 P0 F. h5:AD8 D1 F8 I$ O. P+ e
6:C
7 _  B7 y% Q8 L* T7:E
; y6 t$ x& S2 }4 O+ ?5 L% \& b* z8:E, w! ^; ?7 F0 F2 q
9:C
4 j2 ~( K3 z5 C: ?  F! s10:A
) F' i$ T9 V; f# R. j; d6 C11:BD
7 f# Q$ i3 q9 d$ W12:fopen()
8 `) ~: u2 W3 ]' ^13:BDE
. G) Q. f. C' r  i14:fwrite(), fputs()) A" K1 p- n6 k9 j( a7 Q3 x
15:A
, q. A5 }/ w  Y* z- @/ B16:is_writeable()
( J) h3 h8 t* ]7 M' |2 m+ w# T17:D
- h. C/ ?4 ^4 l2 l* l& M+ t' I18:B
" o9 o# E/ p, q7 M6 B19:B
" f7 l* \0 o* j5 E20:E+ E4 l6 }& p- o+ Z
" j8 t! \1 T; |4 U9 |
) `- v$ a7 D8 @7 j$ H  H
  U7 o( c" X3 o
答案详解4 i3 X. n/ r  W  w) K9 E
( f( \! s( Q% r: q0 _( R* c
1.fgets函数主要用来从文本文件中读取一行,当然你也可以指定每次读取的最大长度。fread函数主要用来读取二进制数据。答案是D。) ]8 U( K5 E8 j( H$ Z# @( {7 m
0 }- j" f" D# z  V, x8 x) o) A4 ~
2.函数fclose能关闭文件指针。( @) \' \9 t# M# |3 `( K9 W

8 S. {% `* N  ~% A# X5 r5 I/ f7 J4 Y3.fgets函数能从文件中读取单独一行。因此答案是D。' q5 {) B" ]# p  Y; r$ u$ P5 P7 W

: {  t( j4 G) h: U& }! K% r4.正确答案是D。这题很难,而且在实践中不大可能会碰到这样的问题——但这不正是你读这本书的原因吗?!你必须记住,flock()使用一种“协议”锁定机制,即所有其他访问此文件的进程也必须要使用flock()。如果某个进程没有这么做,竞争就会产生,锁就不安全。用mkdir创建一个文件夹能保证任何时刻只有一个进程处理能处理某文件,即保证操作的原子性。因此,你可以创建一个临时文件夹并“护”住它,直到I/O操作完成。
2 Q/ Y! T& w8 k% o+ |
* m1 G# B% d" W* \- s5.只有file_get_contents和file函数返回文件的全部内容,因此答案是A和D。readfile函数也能读取文件的全部内容,但它直接把内容送入了输出缓存,因此不能用在表达式中。# J6 f  O2 y7 L# S8 k

$ [% o& A' F& k7 Z8 e* L/ P4 h6.fscanf函数能根据指定格式解析文件内容,因此答案是C。sscanf函数只能用来操作字符串。! z8 K. {" `4 c) D1 N+ v
( A  }4 E$ V0 g& l: Y8 t/ A* }
7.答案是E。注意,文件被以r模式打开,即只读模式。因此,如果文件不存在,PHP将输出一个错误来指出没有找到文件。如果文件存在,fopen()将被成功调用,但由于是以只读方式打开,fwrite()会失败。如果我们用w代替r,脚本就能正常运行,并且myfile.txt内将有50个随机字符(记住,可以像访问数组那样使用索引来访问字符串)。$ I3 C% B  u8 [+ r2 g* X

" Y* C& K" w! j( S( a4 X( t8.答案是E。PHP里没有叫delete()的函数。删除文件用unlink(),删除文件夹用rmdir(),数据库记录用SQL语句删除,释放变量用unset()。
4 b2 A' n# o: c- D" P5 H5 ?3 ]
( r0 ]% n$ v5 c- l# Q( u" x* _9.脚本实现的功能与file_put_contents()最接近,但这个函数直到PHP5才被引入,因此答案是C。
$ }" P2 T& M4 q: R0 s% q$ @
/ j& P' v! Y( h0 t$ C, V. X( N: `10.PHP4.3.0开始,php.ini引入了auto_detect_line_endings设置,系统在保存文本文件时能够自动侦测行结束符号的类型,因此答案是A。
, k" @1 x* x  _
/ X& l4 i2 b6 M' ]" F11.要可读可写的打开文件,你必须使用r+模式,因此答案是B和D。
6 p, _9 Z8 l; t6 z1 i9 f6 v& ]4 l
12.这是在说fopen()函数。0 ^8 h  v3 \( F% Z! g5 g! j5 k
, o% E$ N& b2 h7 t- j5 r) T3 Z
13.正确答案是B,D和E。file,readfile和file_get_contents都能读取文件的全部内容。" D4 {6 P  R3 z/ ]3 Z
; d0 I/ M7 _3 D/ ]
14.fwrite()和fputs()两个函数在这里都可以,而后者其实是前者的别名。在PHP中,写入二进制数据和写入字符串没有区别。3 \* p: ?0 f. x- e; M; }" o& o

. D1 v  S& L6 [, T# l15.PHP会缓存某些文件系统函数的返回值——包括file_exists(),这样能提高脚本处理重复操作时的效率。当脚本里有大量删除文件的操作时,缓存很容易就会过时,因此需要清理缓存。答案是A。
" g7 I  K. u) n3 O( j! \% U3 p( S* G, F* a
16.这是在说is_writeable函数,它返回一个表示文件是否可写的布尔值。
/ y* d3 u5 g4 Y1 r+ {% P% e4 K) s1 Z5 C
17.正确答案是D。fseek()用来移动文件指针。SEEK_SET指出偏移量从文件开头开始计算。如果没有特别指出,SEEK_SET就是fseek()的默认模式。注意,rewind函数等效于fseek(0,SEEK_SET)。# j% O6 f* R6 s2 b1 K- `" y& G

/ V5 s2 A1 E" A9 C: w18.答案是B。fstat函数通过已打开的文件指针取得文件信息,stat()获取指定路径的文件信息。
% J+ j( W- U/ H9 X5 U+ F3 P8 r6 X" C, H0 m) p
19.正确答案是B。disk_free_space函数能确定指定设备上(本题中即Windows下的C盘)的剩余磁盘空间(单位是byte),而disk_total_space()能确定设备的总容量。两者相除,再乘以百分率,最后用number_format()保留两位小数,脚本输出的就是剩余磁盘空间所占的比例。最后在加上百分号以防混淆。
- p* M2 ^1 U3 T5 s$ b$ \9 Y6 J6 [' h0 {+ w, J# R
20.答案是E。你注意到两个代码块之间的空行了吗?它将被输出到浏览器上,使得整个图片的二进制数据出错。因此浏览器将显示一个破碎的图片(或者是一条信息,指出图片出错)。(译者注:原文中两个代码块之间并没有空行,而在我添加了空行之后,也没有调试出答案中描述的情况。)

返回列表
【捌玖网络】已经运行: