在这里积累学习中的点点滴滴!

c语言文件操作 【转】

上一篇 / 下一篇  2009-01-09 18:03:28 / 个人分类:语言类

 
 
13.3 文件的打开与关闭
+C~ m&H2l:t_0文件在进行读写操作之前要先打开,使用完毕要关闭。所谓打开文件,实际上是建立文件的各种有关信息,并使文件指针指向该文件,以便进行其它操作。关闭文件则断开指针与文件之间的联系,也就禁止再对该文件进行操作。51Testing软件测试网8^?%n hy qP7?
51Testing软件测试网,Q7\rDqR]"`x
在C语言中,文件操作都是由库函数来完成的。在本章内将介绍主要的文件操作函数。51Testing软件测试网(d8HT!C8p6E$?z6S_/^/T[

}-h }X,W}013.3.1 文件的打开(fopen函数)
xewr;R.g$L"g0fopen函数用来打开一个文件,其调用的一般形式为:51Testing软件测试网2H#U5giK RJF

|\@%}#PT0O0文件指针名=fopen(文件名,使用文件方式);
vp*F9zd+t.R!W)^.[0
;tk2wr.\h0其中,
l.}-fZu$b&u$g"S051Testing软件测试网nw;Z$b)r"f/[
“文件指针名”必须是被说明为FILE 类型的指针变量;51Testing软件测试网 K:ADCH8}
51Testing软件测试网&B(mB h4U
“文件名”是被打开文件的文件名;
r.Op+Yz5zxF1h0
"Q/Ai? DaC%t!^/G3d0“使用文件方式”是指文件的类型和操作要求。51Testing软件测试网0q/M9tX7M
51Testing软件测试网+A7BH OJ
“文件名”是字符串常量或字符串数组。
8U2nfG,w FQ9d/bx0
frzEG2rs$d0例如:51Testing软件测试网$s|4k6m Z,n

r!U(pJ+p0FILE *fp;51Testing软件测试网 FVg R6k0B T/G&Z{|

gs tc;Tz0`0fp=("file a","r");
3C"c ~ Y P_;Z%f0
.NX P#yhP_i _6WJN0其意义是在当前目录下打开文件file a,只允许进行“读”操作,并使fp指向该文件。
qB-zuI8x0
q&`9k&o\n5V Z#t0又如:51Testing软件测试网(]"[ `.L.^A:Cy
51Testing软件测试网)k(AM%O$EB1G#rU
FILE *fphzk
B{GKh&A,C051Testing软件测试网;^2iM;s mb(A-[
fphzk=("c:\\hzk16","rb")51Testing软件测试网|gGHz1p

v!L N'w#J(K0其意义是打开C驱动器磁盘的根目录下的文件hzk16,这是一个二进制文件,只允许按二进制方式进行读操作。两个反斜线“\\ ”中的第一个表示转义字符,第二个表示根目录。
h8T \-[1C~/o |tN051Testing软件测试网8Nr*Dv5M4cu
使用文件的方式共有12种,下面给出了它们的符号和意义。
PR7@ad o$Y0
'c*\:T3F,o.H+k0T7{v0文件使用方式
@~g-P8V0意义
2\ z eV$},b|3f N7P0
0g"p9{*b%S4Qt.jE T0“rt”
'nHdMv,^$k"[p4TU0只读打开一个文本文件,只允许读数据
m2N-z5x"H?s051Testing软件测试网` Mb&Y?,w9b |p^
“wt”
x)et[.?t$r0Y0只写打开或建立一个文本文件,只允许写数据
)U#FMWZy$`0
9Rf-Z m$Ajl0“at”
:h HRb!R`#@ N R1pU0追加打开一个文本文件,并在文件末尾写数据
0Z'v j!n4x#y1o0
M3} N(H^(E8~+\P0“rb”
I/_E E3M0只读打开一个二进制文件,只允许读数据51Testing软件测试网 _ DH#S0C9V;` kn

!iI`{1U0“wb”
9s+_mE f0只写打开或建立一个二进制文件,只允许写数据51Testing软件测试网TC!y6w}"uj

})~&|Xk/d4J:\&J0“ab”
*~8zv`2j)g(p ~6z0追加打开一个二进制文件,并在文件末尾写数据51Testing软件测试网jE?j kN+i
51Testing软件测试网n6X8dQ ?6gG]}
“rt+”
lF}An,O"W+h0读写打开一个文本文件,允许读和写
&D r$IKX*ga bJd/v0
zVFk7T `0“wt+”
N+ENt2?#k$n6Jr4W3b0读写打开或建立一个文本文件,允许读写
}cl*@(b_!f0
PMJ&_TCV+V0“at+”
r#]q8~ iw0读写打开一个文本文件,允许读,或在文件末追加数据51Testing软件测试网7R(U Byr"d

#hg|"h_^~C7H0“rb+”
!K GL"de@@0读写打开一个二进制文件,允许读和写51Testing软件测试网 b_Fr:E y+V.E-pP
51Testing软件测试网7rl:O S]-??R
“wb+”51Testing软件测试网E:\F.@F,S O[B2Q
读写打开或建立一个二进制文件,允许读和写
;K[V"UN.l0
s/i\+l,^y0“ab+”
f};L O%I"C Q,qC0读写打开一个二进制文件,允许读,或在文件末追加数据
,{8wS?td't7j)aX0
"Q R&U-NPh3hmp051Testing软件测试网Se2y0J&P+C D/@&L
对于文件使用方式有以下几点说明:
Lk(^"@c+{ P*JQ \0
1\u't9nc7@y01) 文件使用方式由r,w,a,t,b,+六个字符拼成,各字符的含义是:51Testing软件测试网1dP'f&`\'p\
51Testing软件测试网(@ ~d$sQ-}\p
r(read): 读51Testing软件测试网5bF~-Kkqx
51Testing软件测试网P8Ze }?/q]:y$~
w(write): 写
C[ E t.kl0
!D{s:o6wg6L9S0a(append): 追加51Testing软件测试网c1R{%j1Q

Xe$WXC8ef E-Y0t(text): 文本文件,可省略不写
{Z2iq!g*}9]7F051Testing软件测试网Rw2B*_3o;c,E1@V+Jl.c
b(banary): 二进制文件
Pj@|w5An0
8^y+N6BK(cMYPQ0+: 读和写51Testing软件测试网eF6jto/U I
51Testing软件测试网&wrnIQ K1ip H
2) 凡用“r”打开一个文件时,该文件必须已经存在,且只能从该文件读出。
w _Za7]0P_d-L o0
ioNW l+nT03) 用“w”打开的文件只能向该文件写入。若打开的文件不存在,则以指定的文件名建立该文件,若打开的文件已经存在,则将该文件删去,重建一个新文件。51Testing软件测试网5C_]T+dI,^r

"{9?.^~y04) 若要向一个已存在的文件追加新的信息,只能用“a”方式打开文件。但此时该文件必须是存在的,否则将会出错。51Testing软件测试网9Bqom4x
51Testing软件测试网n&oS%VSZ7I y
5) 在打开一个文件时,如果出错,fopen将返回一个空指针值NULL。在程序中可以用这一信息来判别是否完成打开文件的工作,并作相应的处理。因此常用以下程序段打开文件:51Testing软件测试网'q,t.w r k7NE*I
51Testing软件测试网4@%x"^1f8o S jhe
6) if((fp=fopen("c:\\hzk16","rb")==NULL)
.z7znJB051Testing软件测试网0wl n U5r0~
{
%|'C\s2L051Testing软件测试网Q4XIDf.k
printf("\nerror on open c:\\hzk16 file!");
C T0b pT2[A051Testing软件测试网J/n ]h2b;F`
getch();51Testing软件测试网2ho'n#i?L_kY

w6f{O&B8m D4o`0exit(1);
:IDS5])KW051Testing软件测试网j#u?HW0Cg&U
}51Testing软件测试网y.gkZ5P"}L,q
51Testing软件测试网{3V]X|
这段程序的意义是,如果返回的指针为空,表示不能打开C盘根目录下的hzk16文件,则给出提示信息“error on open c:\ hzk16 file!”,下一行getch()的功能是从键盘输入一个字符,但不在屏幕上显示。在这里,该行的作用是等待,只有当用户从键盘敲任一lose函数返回值为0。如返回非零值则表示有错误发生。51Testing软件测试网pL6gL%I5V
51Testing软件测试网4F[p9dA _8b1G
13.4 文件的读写51Testing软件测试网1Y{!Y#R[vq
对文件的读和写是最常用的文件操作。在C语言中提供了多种文件读写的函数:
nz#s"@;M2t%\.vn051Testing软件测试网d.iGc!e]
·字符读写函数 :fgetc和fputc
;a_;P5g}0X'x*LB0
m8^ j1b2d4~"[+@A0·字符串读写函数:fgets和fputs51Testing软件测试网h"qTMc!@/h7{t
51Testing软件测试网-u/~L4l8Q]U
·数据块读写函数:freed和fwrite
*D-G:_t ?#y4Jh051Testing软件测试网pML'hF[)B
·格式化读写函数:fscanf和fprinf
a\M;e&s$W;KE0U051Testing软件测试网5c(] F-x+ul
下面分别予以介绍。使用以上函数都要求包含头文件stdio.h。
`"d6A@L_(x0
b2BV+P-U e4ck013.4.1 字符读写函数fgetc和fputc51Testing软件测试网 \v'~~DT%Z
字符读写函数是以字符(字节)为单位的读写函数。每次可从文件读出或向文件写入一个字符。51Testing软件测试网*LZs!yP$U Z+{/@P$~
51Testing软件测试网2Tr:xf-Q7D0c
1. 读字符函数fgetc51Testing软件测试网gO HU;^H7}~1Z

%e8s;G(Hj0fgetc函数的功能是从指定的文件中读一个字符,函数调用的形式为:
"a |uS eOB:T,@1z-Rg"@051Testing软件测试网!?!yS b A ^5k;^"hA
字符变量=fgetc(文件指针);
pQ8}f:|f0
&J'GD8R*Q[0例如:
4~ BM9n6ld9H051Testing软件测试网 ? m(qXk8G;c\ a.w
ch=fgetc(fp);
!}0Lh%\ \i0
g4hxf4|;}wB0其意义是从打开的文件fp中读取一个字符并送入ch中。
U,h!dw uU4lNn(l1_051Testing软件测试网 XK&A,]~
对于fgetc函数的使用有以下几点说明:
wM?SvF7o'Ts0X3m:k0
:k7D%X{W uv01) 在fgetc函数调用中,读取的文件必须是以读或读写方式打开的。51Testing软件测试网 H(NM,{g;M
51Testing软件测试网#R1T/d-GA Rom9U
2) 读取字符的结果也可以不向字符变量赋值,
_,W!Lv Kr3\wd051Testing软件测试网Di7Y qwU/n{
例如:
{"H*w;{1}fa051Testing软件测试网/@+A_"wl
fgetc(fp);
\G!yL1J R051Testing软件测试网Q/t T/s:E-dt~
但是读出的字符不能保存。51Testing软件测试网(t/C'[_vU

X0y#n u3h@p03) 在文件内部有一个位置指针。用来指向文件的当前读写字节。在文件打开时,该指针总是指向文件的第一个字节。使用fgetc 函数后,该位置指针将向后移动一个字节。 因此可连续多次使用fgetc函数,读取多个字符。应注意文件指针和文件内部的位置指针不是一回事。文件指针是指向整个文件的,须在程序中定义说明,只要不重新赋值,文件指针的值是不变的。文件内部的位置指针用以指示文件内部的当前读写位置,每读写一次,该指针均向后移动,它不需在程序中定义说明,而是由系统自动设置的。
x6XG"e7c2zD0
G yG Q"g0【例13.1】读入文件c1.doc,在屏幕上输出。
,hMF9[4vD/A051Testing软件测试网X ipl#z
#include<stdio.h>51Testing软件测试网P EQf4R
main()51Testing软件测试网O!lNL5aXg R
{
P%wXi^k$t)n+J0FILE *fp;
+o~0O/a@3{%XqBD4m0charch;
%o^ Z u||6P,b(\0if((fp=fopen("d:\\jrzh\\example\\c1.txt","rt"))==NULL)
s0h3tk$y0{
4f`zj8j0printf(
"\nCannot open file strike any key exit!");
t `-HH%k5{ |.f!XB$@0getch();51Testing软件测试网.[n1ZG(ImK*f~d
exit(1);
;Gu1c `*}-M5f'g0}
-d3EF r7kS;| ~0ch=fgetc(fp);
L;Mm.BN.h+x0while(ch!=EOF)
r)[5Y!b9}8]2Cb0{51Testing软件测试网 ZN3V2yB'z#HOP%g"t
putchar(ch);51Testing软件测试网zp^N2r)~`6~KX
ch=fgetc(fp);
l{W{%aS}0}51Testing软件测试网q^LK3bkH
fclose(fp);51Testing软件测试网)S E,P5y5Z.D0U-KA
}
)V0L4T5T [&c0
jP Ch A;J0本例程序的功能是从文件中逐个读取字符,在屏幕上显示。程序定义了文件指针fp,以读文本文件方式打开文件“d:\\jrzh\\example\\ex1_1.c”,并使fp指向该文件。如打开文件出错,给出提示并退出程序。程序第12行先读出一个字符,然后进入循环,只要读出的字符不是文件结束标志(每上,再读入下一字符。每读一次,文件内部的位置指针向后??本程序将显示整个文件。51Testing软件测试网m4q/TA _`{1[`

RT/]&Z'c?iK02. 写字符函数fputc51Testing软件测试网"z:A&~#g$z)Q-w

;wqA-r1X c"["u0fputc函数的功能??为:51Testing软件测试网0l"g&}4LFa]

JA`zHX)z0fputc(字符量,文件指量或变量,例如:51Testing软件测试网9g\1kV WB
51Testing软件测试网aL$iBdi;J
fputc('a',fp);
X9Oj){p.V!OB*F(x0
a#Siv&m7|z0其意putc函数的使用也要说明几点:
exDc6g0
,T?Y%i X&O01) 被写入的文件可以用写、读写、追加方式打开,用写或读写方式??写入字符从文件首开始。如需保留原有文件内容,希望写入的字??被写入的文件若不存在,则创建该文件。
@/c6U^M051Testing软件测试网7RD ?;q4w*Go
2) 每写入一个字符,文件内部位置指针向后移动一个字节。51Testing软件测试网9?7a5mv'j0I g [6Q
51Testing软件测试网kVbnEK
3) fputc函数有一个返回值,如写入成功则返回写入的字符,否则返回一个EOF。可用此来判断写符,写入一个文件,再把该文件内容读出显示在屏幕上。51Testing软件测试网-GJ8o w*qzp-hba
#include<stdio.h>51Testing软件测试网]E,RB%Ofs
main()
eC+P(v$x_y0{
oH_ |e&UR0FILE *fp;
@WH5i1y,H051Testing软件测试网#m ByN0g G
charch;51Testing软件测试网JGT:sVMW
if((fp=fopen(
"d:\\jrzh\\example\\string","wt+"))==NULL)51Testing软件测试网w/G2El|+Imeo
{
C4q/lLa7O8o(Y3c\0printf(
"Cannot open file strike any key exit!");
)Wr [:fQU/R8rMj#l3L0getch();51Testing软件测试网 oN'Q0gL X4W}2N
exit(1);
1fxP)pG6T-Bn*n-vl)b051Testing软件测试网JY }} mWC.e%xe4o@
}51Testing软件测试网 wd!\3M ^-BVg
51Testing软件测试网S?`4ym-a
printf(
"input a string:\n");51Testing软件测试网@.na%RlW@2_]\&B
ch=getchar();51Testing软件测试网y&a2Jye0a3u

D{SK'{*P @(n0while(ch!='\n')
uZ5AE oq0{51Testing软件测试网.]4GtE5]"{9R]m
fputc(ch,fp);
V3l$@7^,go0ch=getchar();51Testing软件测试网'n)w4bN/L'Is
}

MI)Scr-nA)Pr3B Z0rewind(fp);
R5`*g9e!{1C c'T0j+{]0ch=fgetc(fp);
(RW.}%G\{0while(ch!=EOF)
T3{D"R.H S%D [i0{51Testing软件测试网re,@z0|^
putchar(ch);51Testing软件测试网#b*[o$b2g
ch=fgetc(fp);51Testing软件测试网"q"XA_ @q%BT
}51Testing软件测试网H}DV.j*oD
printf(
"\n");
!Dw;d X4JivfiR m0fclose(fp);51Testing软件测试网.g Vq_ nF
}51Testing软件测试网 Q$K!_;Q ks A;w[
51Testing软件测试网]c S)o|/utCv
程序中第6行以读写文本文件方式打开文件string。程序第13行从键盘读入一个字符后进入循环,当读入字符不为回车符时,则把该字符写入文件之中,然后继续从键盘读入下一字符。每输入一个字符,文件内部位置指针向后移动一个字节。写入完毕,该指针已指向文件末。如要把文件从头读出,须把指针移向文件头,程序第19行rewind函数用于把fp所指文件的内部位置指针移到文件头。第20至25行用于读出文件中的一行内容。
OQ]b Y0
Y^.\*q@e}7r8ww0【例13.3】把命令行参数中的前一个文件名标识的文件,复制到后一个文件名标识的文件中,如命令行中只有一个文件名则把该文件写到标准输出文件(显示器)中。
s0T+q.p5D.P5q b051Testing软件测试网gp#| T#?Ta6G|;C
#include<stdio.h>51Testing软件测试网d^mwZ,Rd
main(intargc,char*argv[])51Testing软件测试网1B+W4G m#xz:[P
{
@?;Ow0ofE~0FILE *fp1,*fp2;51Testing软件测试网U ZM4g4o:MF
charch;51Testing软件测试网L*gV i'q(atb
if(argc==1)51Testing软件测试网-ge&RU4qI6UR?
{51Testing软件测试网v f1Eev'x:C5B.m
printf(
"have not enter file name strike any key exit");
U'DG*SK)T,o&cH5g0getch();51Testing软件测试网&HN`%F?APg\3g
exit(0);51Testing软件测试网5_xE)DsTK
}

R~V6IqHAhPl8H J!y\0if((fp1=fopen(argv[1],
"rt"))==NULL)51Testing软件测试网k} B(w5X]
{
.zQdvx0printf(
"Cannot open %s\n",argv[1]);
}
文档出处:http://www.zhuoda.org/elite/34441.html

TAG: 语言类

 

评分:0

我来说两句

Open Toolbar