第八章 输入输出和文件系统Word文档格式.docx

上传人:b****6 文档编号:16509117 上传时间:2022-11-24 格式:DOCX 页数:22 大小:26.15KB
下载 相关 举报
第八章 输入输出和文件系统Word文档格式.docx_第1页
第1页 / 共22页
第八章 输入输出和文件系统Word文档格式.docx_第2页
第2页 / 共22页
第八章 输入输出和文件系统Word文档格式.docx_第3页
第3页 / 共22页
第八章 输入输出和文件系统Word文档格式.docx_第4页
第4页 / 共22页
第八章 输入输出和文件系统Word文档格式.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

第八章 输入输出和文件系统Word文档格式.docx

《第八章 输入输出和文件系统Word文档格式.docx》由会员分享,可在线阅读,更多相关《第八章 输入输出和文件系统Word文档格式.docx(22页珍藏版)》请在冰豆网上搜索。

第八章 输入输出和文件系统Word文档格式.docx

ANSIC为每个被使用的文件在内存开辟一块用于存放上述信息的小区,利用一个结构体类型的变量存放。

该变量的结构体类型由系统取名为FILE,在头文件stdio.h中定义如下:

typedefstruct{

int_fd;

/*文件号*/

int_cleft;

/*缓冲区中的剩余字符*/

int_mode;

/*文件的操作模式*/

char*_next;

/*下一个字符的位置*/

char*_buff;

/*文件缓冲区的位置*/

}FILE;

在操作文件以前,应先定义文件变量指针:

FILE*fp1,fp2;

按照上面的定义,fp1和fp2均为指向结构体类型的指针变量,分别指向一个可操作的文件,换句话说,一个文件有一个文件变量指针,今后对文件的访问,会转化为针对文件变量指针的操作。

2.文件的打开

ANSIC提供了打开文件的函数:

FILE*fopen(char*fname,char*mode)

函数原型在stdio.h文件中,fopen()打开一个fname指向的外部文件,返回与它相连接的流。

fname是字符串,应是一个合法的文件名,还可以指明文件路经。

对文件的操作模式由mode决定,mode也是字符串,由表8-1给出mode的取值表。

表8-1mode的取值表

Mode 

含 

义 

打开一个文本文件只读 

打开一个文本文件只写 

打开一个文本文件在尾部追加 

rb 

打开一个只读的二进制文件 

wb 

打开一个只写的二进制文件 

ab 

对二进制文件追加 

r+ 

打开一个可读/写的文本文件 

w+ 

创建一个新的可读/写的文本文件 

a+ 

rb+ 

打开一个可读/写的二进制文件 

wb+ 

创建一个新的可读/写的二进制文件 

打开一个可读/写的二进制文件

如表8-1所示,文件的操作方式有文本文件和二进制文件两种,打开文件的正确方法如下

例所示:

#include<

stdio.h>

FILE*fp;

If((fp=fopen("

test.txt"

"

w"

))==NULL)

{/*创建一个只写的新文本文件*/

printf("

cannotopenfile\n"

);

exit(0);

}

这种方法能发现打开文件时的错误。

在开始写文件之前检查诸如文件是否有写保护,磁盘是否已写满等,因为函数会返回一个空指针NULL,NULL值在stdio.h中定义为0。

事实上打开文件是要向编译系统说明三个信息:

①需要访问的外部文件是哪一个。

②打开文件后要执行读或写即选择操作方式。

③确定哪一个文件指针指向该文件。

对打开文件所选择的操作方式来说,一经说明不能改变,除非关闭文件后重新打开。

是只读就不能对其写操作,对已存文件如以新文件方式打开,则信息必丢失。

3.文件的关闭

ANSIC提供了关闭文件的函数:

intfclose(FILE*stream)

fclose()函数关闭与stream相连接的文件,并把它的缓冲区内容全部写出。

在fclose()函数调用以后,流stream与此文件无关,同时原自动分配的缓冲区也失去定位。

fclose()函数关闭文件操作成功后,函数返回0;

失败则返回非零值。

[例8-1]打开和关闭一个可读可写的二进制文件:

main()

{

FILE*fp;

If((fp=fopen("

test.dat"

rb"

{

printf("

cannotopenfile\n"

exit(0);

}

/*写入对文件执行读写的代码*/

if(fclose(fp))printf("

filecloseerror!

\n"

8.1.2文件的读写

当文件按指定的工作方式打开以后,就可以执行对文件的读和写。

下面按文件的性质分类进行操作。

针对文本文件和二进制文件的不同性质,对文本文件来说,可按字符读写或按字符串读写;

对二进制文件来说,可进行成块的读写或格式化的读写。

1.读写字符

C提供fgetc和fputc函数对文本文件进行字符的读写,其函数的原型存于stdio.h头文件中,格式为:

intfgetc(FILE*stream)

fgetc()函数从输入流的当前位置返回一个字符,并将文件指针指示器移到下一个字符处,假如已到文件尾,函数返回EOF,此时表示本次操作结束,若读写文件完成,则应关闭文件。

intfputc(intch,FILE*stream)

fputc()函数完成将字符ch的值写入所指定的流文件的当前位置处,并将文件指针后移一位。

fputc()函数的返回值是所写入字符的值,出错时返回EOF。

[例8-2]将存放于磁盘的指定文本文件按读写字符方式逐个地从文件读出,然后再将其显示到屏幕上。

采用带参数的main(),指定的磁盘文件名由命令行方式通过键盘给定。

main(argc,argv)

intargc;

char*argv[];

charch;

inti;

if((fp=fopen(argv[1],"

r"

))==NULL)/*打开一个由argv[1]所指的文件*/

notopen"

while((ch=fgetc(fp))!

=EOF)/*从文件读一字符,显示到屏幕*/

putchar(ch);

fclose(fp);

程序是一带参数的main()函数,要求以命令行方式运行,其参数argc是用于记录输入参数的个数,argv是指针数组,用于存放输入参数的字符串,串的个数由argc描述。

假设我们指定读取的文件名为L8-2.c,并且列表文件内容就是源程序。

经过编译和连接生成可执行的文件L8-2.exe。

运行程序l8-2.exe,输入的命令行方式为:

c:

\tc>

l8-2L8-2.c

上述程序以命令行方式运行,其输入参数字符串有两个,即argv[0]="

l8-2"

、argv[1]="

L8-2.c"

,argc=2。

故打开的文件是L8-2.c。

程序中对fgetc()函数的返回值不断进行测试,若读到文件尾部或读文件出错,都将返回C的整型常量EOF,其值为非零有效整数。

程序的运行输出为源程序本身:

#include<

main(argc,argv)

char*argv[];

))==NULL)/*打开一个由argv[1]所指的文件*/

[例8-3]从键盘输入字符,存到磁盘文件test.txt中:

FILEfp;

/*定义文件变量指针*/

if((fp=fopen("

))==NULL) 

/*以只写方式打开文件*/

cannotopenfile!

while((ch=fgetchar())!

='

\n'

)/*只要输入字符非回车符*/

fputc(ch,fp)/*写入文件一个字符*/

程序通过从键盘输入一以回车结束的字符串,写入指定的流文件test.txt,文件以文本只写方式打开,所以流文件具有可读性,能支持各种字符处理工具访问。

简单地说,我们可以通过DOS提供的type命令来列表显示文件内容。

运行程序:

Ilovechina!

在DOS操作系统环境下,利用type命令显示test.txt文件如下:

typetest.txt

2.读写字符串

C提供读写字符串的函数原型在stdio.h头文件中,其函数形式为:

Char*fgets(char*str,intnum,FILE*stream)

fgets()函数从流文件stream中读取至多num-1个字符,并把它们放入str指向的字符数组中。

读取字符直到遇见回车符或EOF(文件结束符)为止,或读入了所限定的字符数。

intfputs(char*str,FILE*stream)

fputs()函数将str指向的字符串写入流文件。

操作成功时,函数返回0值,失败返回非零值。

[例8-4]向磁盘写入字符串,并写入文本文件test.txt:

string.h>

charstr[128];

if((fp=fopen("

))==NULL)/*打开只写的文本文件*/

"

while((strlen(gets(str)))!

=0)

{/*若串长度为零,则结束*/

fputs(str,fp);

/*写入串*/

fputs("

fp);

/*写入回车符*/

/*关文件*/

运行该程序,从键盘输入长度不超过127个字符的字符串,写入文件。

如串长为0,即空串,程序结束。

输入:

Hello!

Howdoyoudo

Good-bye!

运行结束后,我们利用dos的type命令列表文件:

typetest.txt

这里所输入的空串,实际为一单独的回车符,其原因是gets函数判定串的结束是以回车作标志的。

[例8-5]从一个文本文件test1.txt中读出字符串,再写入令一个文件test2.txt。

FILE*fp1,*fp2;

if((fp1=fopen("

test1.txt"

{/*以只读方式打开文件1*/

if((fp2=fopen("

test2.txt"

{/*以只写方式打开文件2*/

while((strlen(fgets(str,128,fp1)))>

0)

/*从文件中读回的字符串长度大于0*/

fputs(str,fp2);

/*从文件1读字符串并写入文件2*/

%s"

str);

/*在屏幕显示*/

fclose(fp1);

fclose(fp2);

程序共操作两个文件,需定义两个文件变量指针,因此在操作文件以前,应将两个文件以需要的工作方式同时打开(不分先后),读写完成后,再关闭文件。

设计过程是按写入文件的同时显示在屏幕上,故程序运行结束后,应看到增加了与原文件相同的文本文件并显示文件内容在屏幕上。

3.格式化的读写

前面的程序设计中,我们介绍过利用scanf()和printf()函数从键盘格式化输入及在显示器上进行格式化输出。

对文件的格式化读写就是在上述函数的前面加一个字母f成为fscanf()和fprintf()。

其函数调用方式:

intfscanf(FILE*stream,char*format,arg_list)

intfprintf(FILE*stream,char*format,arg_list)

其中,stream为流文件指针,其余两个参数与scanf()和printf()用法完全相同。

[例8-6]将一些格式化的数据写入文本文件,再从该文件中以格式化方法读出显示到屏

幕上,其格式化数据是两个学生记录,包括姓名、学号、两科成绩。

structstu{/*定义结构体类型*/

charname[15];

charnum[6];

floatscore[2];

}student;

/*说明结构体变量*/

{/*以文本只写方式打开文件*/

cannotopenfile"

inputdata:

for(i=0;

i<

2;

i++)

scanf("

%s%s%f%f"

student.name,student.num,&

student.score[0],

&

student.score[1]);

/*从键盘输入*/

fprintf(fp,"

%s%s%7.2f%7.2f\n"

student.name,student.num,

student.score[0],student.score[1]);

/*写入文件*/

/*关闭文件*/

{/*以文本只读方式重新打开文件*/

outputfromfile:

while(fscanf(fp,"

%s%s%f%f\n"

student.score[0],student.score[1])!

=EOF)

/*从文件读入*/

student.score[0],student.score[1]);

/*显示到屏幕*/

程序设计一个文件变量指针,两次以不同方式打开同一文件,写入和读出格式化数据,有一点很重要,那就是用什么格式写入文件,就一定用什么格式从文件读,否则,读出的数据与格式控制符不一致,就造成数据出错。

上述程序运行如下:

xiaowanj00187.598.4

xiaolij00299.589.6

xiaowanj00187.5098.40

xiaolij00299.5089.60

列表文件的内容显示为:

\>

此程序所访问的文件也可以定为二进制文件,若打开文件的方式为:

if((fp=fopen("

wb"

{/*以二进制只写方式打开文件*/

其效果完全相同。

4.成块读写

前面介绍的几种读写文件的方法,对其复杂的数据类型无法以整体形式向文件写入或从文件读出。

C语言提供成块的读写方式来操作文件,使其数组或结构体等类型可以进行一次性读写。

成块读写文件函数的调用形式为:

intfread(void*buf,intsize,intcount,FILE*stream)

intfwrite(void*buf,intsize,intcount,FILE*stream)

fread()函数从stream指向的流文件读取count(字段数)个字段,每个字段为size(字段长度)个字符长,并把它们放到buf(缓冲区)指向的字符数组中。

fread()函数返回实际已读取的字段数。

若函数调用时要求读取的字段数超过文件存放的字段数,则出错或已到文件尾,实际在操作时应注重检测。

fwrite()函数从buf(缓冲区)指向的字符数组中,把count(字段数)个字段写到stream所指向的流中,每个字段为size个字符长,函数操作成功时返回所写字段数。

关于成块的文件读写,在创建文件时只能以二进制文件格式创建。

[例8-7]向磁盘写入格式化数据,再从该文件读出显示到屏幕。

#include"

stdio.h"

stdlib.h"

FILE*fp1;

structstu{/*定义结构体*/

if((fp1=fopen("

{/*以二进制只写方式打开文件*/

i++)

student.score[0],&

/*输入一记录*/

fwrite(&

student,sizeof(student),1,fp1);

/*成块写入文件*/

{/*重新以二进制只写打开文件*/

for(i=0;

fread(&

/*从文件成块读*/

student.name,student.num,student.score[0],student.score[1]);

xia

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 考试认证 > IT认证

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1