你可能觉得PHP的文件操作功能并不怎样,但实际上它对开发者来说非常有用。即使你是做网站开发的,学会相关技能也能让你如虎添翼。多亏了流包装器(stream wrappers,将在第十章详细介绍),PHP才能够打开并读取远程文件,让在本地使用第三方网站的内容变得可能。 / D% o) h9 V# {站在更底层的角度,文件输入/输出能完成多种任务。可以用他读取预制文件的内容,比如第三方提供的内容;或者通过PHP脚本让浏览器打开一个二进制文件,使得你能更切实的控制它。无论如何,本章不仅考验你打开、关闭和读取文件的能力,还考查多进程下进行文件操作的基础知识——例如文件锁。 ) {! S, y# d& s : \$ M; g: }; v" }, |$ g9 S9 u$ _6 X5 L! X
问题1 o4 w6 A# W) |/ O8 W6 p
/ c8 F) ?& K) l5 P0 h4 W
1.函数______能读取文本文件中的一行。读取二进制文件或者其他文件时,应当使用______函数。& h6 X7 h2 x% C: K# @. M1 \1 }( i
. {2 i5 i! M: W, V+ P1 l
A.fgets(), fseek() # j9 o0 l( F9 u/ @. J( NB.fread(), fgets() ' a3 \' \0 _' I9 v' r {! O+ M9 EC.fputs(), fgets()3 c1 C' h3 g0 p. r [0 F& k
D.fgets(), fread()% f0 t$ s+ t, V* a5 N$ D) C
E.fread(), fseek() 5 w- N2 H% l9 ]9 T) p. Q/ d0 y U& }9 }3 J
4 E, w0 |) x4 b( x: M
2.文件指针能在PHP脚本结束时自动关闭,但你也可以用______函数来关闭。+ x$ k U7 I9 y) c* r& j; R/ T
: P5 j! @' y( d( n( M- w& u
答案:____________1 L3 t$ ~. m% C! b7 b4 {
1 ^ S8 z A" ~- m9 N7 x \ ' C: k' O$ C% `7 w8 h) u7 L3.考虑如下PHP脚本,它一行一行的读取并显示某文本文件的内容。在问号处填入什么才能使脚本正常运作?
<?php
$file = fopen("test", "r");
while(!feof($file)) {
echo ????????????;
}
fclose($file);
?>
复制代码
A.file_get_contents($file)& k0 o1 b. E- C
B.file($file)4 `5 |, S8 t g5 F5 M; p. L M
C.read_file($file) i d( c$ C2 g& D7 a$ M8 ^D.fgets($file)4 n; Q3 Y. ~1 v# {
E.fread($file)# J" p% H2 s6 k2 S% T$ Y
" L" v1 |7 v& M2 {" Z* u4 I E/ |
6 v/ ~: S# x; M+ X: q; v. Y3 S4.以下哪种方法能保证锁在任何竞争情况下都安全?( J. h6 Q2 _4 e- ^" n
7 h( w8 x9 K) hA.用flock()锁住指定文件 # |0 D+ U- e, p# P* N! \! U5 ?B.用fopen()在系统的临时文件夹里打开文件 8 h4 I6 O: [2 x; DC.用tempnam()创建一个临时文件 ; S0 o' e. \( [D.用mkdir()创建一个文件夹来当 1 B" C" \7 O; z5 j3 Z- @E.用tmpfile()创建一个临时文件; `& c7 ^6 r& p c3 W
! C1 j2 ]9 n$ J$ n& r7 @( d- |# `0 h- @( b. Z* ^$ \
5.以下哪个函数能够获得文件的全部内容,并能够用在表达式中?(双选) + m" h, Y& z- o6 P# M8 C+ ^1 t ; B- U# V% N2 M5 c4 H+ i# C uA.file_get_contents()' U8 h& j8 j4 v1 Q/ K8 s% G% a
B.fgets()% L' F. ?! z9 J5 i
C.fopen() 2 C! Q$ Q/ m( VD.file() 0 b' B. W% w& m3 t8 z( X O5 sE.readfile()4 C, G- `& b V# \ x% B# f" M
. L. C m+ w7 y2 K, R+ N- h% ?9 Z , E2 q* o# H/ X# b6.在不把文件内容预加载到变量中的前提下,如何解析一个以特殊格式格式化过的多行文件?# w/ C% L. e6 v0 C# j
# V# L Q* C n o2 e3 \* p
A.用file()函数把它分割放入数组 * C3 e2 K3 m7 [" w$ G! c' DB.用sscanf()4 \1 \% ]) x7 i# Y9 Y
C.用fscanf()( _& w' f4 s: ?6 \ K# T
D.用fgets() - \! Y; F3 M: T: @6 t0 p- s& v OE.用fnmatch()4 N y6 Y: @ x, I, _3 j6 S4 S
7 F1 w, Q* m6 m% x ; {) Q& }1 m- Q7.考虑如下脚本,最后文件myfile.txt的内容是什么?
$ S2 i+ B- m5 S, SA.stat()基于文件指针工作,fstat()基于路径工作 $ B. W6 i m+ j! }1 S% CB.fstat()基于文件指针工作,stat()基于路径工作 3 l% ]8 b! y+ @; v, IC.fstat()不能处理文件; j- o: s( ~$ H3 d
D.stat()不能处理文件 3 U8 k. C7 S8 J% \8 K; ^. LE.fstat()是stat()的别名3 m4 z! s" ~. V& s. d
2 F2 m$ F1 E0 w3 _7 {) G/ }+ ~& M! n7 X* M
19.以下哪个选项准确的描述出了方框中的脚本的作用?
<?php
echo number_format (disk_free_space ('c:\\') /
disk_total_space('c:\\') * 100, 2) . '%';
?>
复制代码
A.计算Windows系统C盘的剩余磁盘空间大小$ i0 W% Z# ^- {* C
B.输出一个表示C盘剩余空间所占比例的两位小数 4 f$ E5 r8 v1 l: L% sC.输出C盘剩余容量的byte数# p9 b2 d. v# F6 p
D.计算C盘总容量与剩余空间的比率 8 B& @) l1 t6 \! y! o- ^E.以上都不对 - _3 Z. P' z! r+ Y& u4 p6 L9 }0 z ) W8 v% }) w! O i$ }5 ?5 p9 `7 r, D6 }
20.假设image.jpg存在并能够被PHP读取,调用以下脚本时,浏览器上显示什么?
<?php
header ("Content-type: image/jpeg");
?>
<?php
readfile ("image.jpg");
?>
复制代码
A.一张JPEG图片 ! K3 t& r: q' ~! Q7 l+ A# p% ^8 _B.一个二进制文件 , f2 d3 [4 c+ tC.下载一个二进制文件 / O6 Z+ h# J9 i7 QD.下载一张JPEG图片/ F1 l. J, J. u/ Y* P( n' G
E.一张残破的图片 - s( \" F3 ~2 w3 T: _5 K& M. y6 J, S, s5 X7 r9 N0 N
1 b5 A1 E2 e7 y8 J6 F1 \! q1 O$ I
" I6 y s2 R. d5 R; ?) M答案速查:, z1 u5 V/ H/ }! h- J
1:D * l6 [( `* t* P# h7 ^2:fclose() & q8 M s2 P' x3:D2 E9 U% R$ `4 W) C( o
4:D9 j9 D& h! l: ^: k* i" X
5:AD! W" Q9 `. _# `
6:C/ u, z( j \6 m0 O. q0 @! P
7:E% r- }0 A( R6 f, H' T
8:E 5 V' o: Y# g+ x( z0 }0 ~$ }9:C- \( u- J$ w' ?1 _! O% w- u
10:A- Z" J0 K W5 D5 X" ^" ]
11:BD, H: v4 f; |2 r
12:fopen() . W5 r8 m: p0 g2 l$ Q- N13:BDE $ v) Y% E' {: c2 N14:fwrite(), fputs() 0 N5 v, d% Z8 b% `* a# Q$ I4 N2 d15:A) R' Z. [2 Z( V) y$ a: l# J0 V a
16:is_writeable() 0 s6 P, P$ Z+ C17:D % M( u5 F% @$ U+ {& O18:B1 t5 N9 }3 F$ g. a
19:B: J+ {: x0 z) \" u1 c
20:E ; h- t$ t. ?5 h1 ]: z8 d/ b8 S! H0 Z6 O- Z% X5 P' D; e u; ?
. H' h h9 U9 ]5 O, A " v1 L; j- W1 ]! o: }$ N' }: Y答案详解 - A1 D$ |: r# C2 Y. C# ~ . m- Z4 P k' a- D; M1.fgets函数主要用来从文本文件中读取一行,当然你也可以指定每次读取的最大长度。fread函数主要用来读取二进制数据。答案是D。4 `: I& W2 G1 C8 m. B
5 m N5 p! @) B/ z; P2.函数fclose能关闭文件指针。 % B7 D% D9 K2 y. d! h7 @9 ]/ U4 I, y2 X5 _! ]
3.fgets函数能从文件中读取单独一行。因此答案是D。 3 U: f& d) I- e E# a) } 1 D# U8 I* S; X" u- \4.正确答案是D。这题很难,而且在实践中不大可能会碰到这样的问题——但这不正是你读这本书的原因吗?!你必须记住,flock()使用一种“协议”锁定机制,即所有其他访问此文件的进程也必须要使用flock()。如果某个进程没有这么做,竞争就会产生,锁就不安全。用mkdir创建一个文件夹能保证任何时刻只有一个进程处理能处理某文件,即保证操作的原子性。因此,你可以创建一个临时文件夹并“护”住它,直到I/O操作完成。 ( h+ b& p2 U! C( U$ d& N+ J+ R 2 w9 Z2 R: P" o1 ^. a' G0 T+ L& P5.只有file_get_contents和file函数返回文件的全部内容,因此答案是A和D。readfile函数也能读取文件的全部内容,但它直接把内容送入了输出缓存,因此不能用在表达式中。7 h" d' A9 f6 E! ^" k0 k
+ x' l: Q; M5 `+ Q1 y" |& e
6.fscanf函数能根据指定格式解析文件内容,因此答案是C。sscanf函数只能用来操作字符串。 % w' l' o0 ~8 H0 d: n& j1 A8 `; X) U+ p$ K; o' i& ^
7.答案是E。注意,文件被以r模式打开,即只读模式。因此,如果文件不存在,PHP将输出一个错误来指出没有找到文件。如果文件存在,fopen()将被成功调用,但由于是以只读方式打开,fwrite()会失败。如果我们用w代替r,脚本就能正常运行,并且myfile.txt内将有50个随机字符(记住,可以像访问数组那样使用索引来访问字符串)。 7 T, U% {; ~& a" W o' P / ]* b$ y' l# A g5 @8.答案是E。PHP里没有叫delete()的函数。删除文件用unlink(),删除文件夹用rmdir(),数据库记录用SQL语句删除,释放变量用unset()。 9 K4 e' H3 u+ e. ~% v7 I% e + f6 P& r7 Z5 h5 K* p4 |9.脚本实现的功能与file_put_contents()最接近,但这个函数直到PHP5才被引入,因此答案是C。 1 M" T4 O$ _2 Z9 c9 u# e, D1 L! C$ t& s6 Y1 W/ O0 l
10.PHP4.3.0开始,php.ini引入了auto_detect_line_endings设置,系统在保存文本文件时能够自动侦测行结束符号的类型,因此答案是A。0 N& q3 |* Y0 o, S8 o, q5 h% M# J& d
1 w* \: f, \* h9 }" l8 N11.要可读可写的打开文件,你必须使用r+模式,因此答案是B和D。 # U7 f9 _: e) U. Y7 B4 {& s7 R; {8 f& Y5 `7 e6 M. Z6 P
12.这是在说fopen()函数。4 }$ |$ w9 E# m" P. n" s