2021年中央电大C语言A课程辅导_第1页
2021年中央电大C语言A课程辅导_第2页
2021年中央电大C语言A课程辅导_第3页
2021年中央电大C语言A课程辅导_第4页
2021年中央电大C语言A课程辅导_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C语言程序设计A课程辅导(8)

—第8章文献

重要内容:

一、文献概念

二、文献打开和关闭

三、文本文献访问操作

四、二进制文献访问操作

五、课程总复习

一、文献概念

•文献是计算机外部设备中一种被命名信息单位

>原则输入输出(I/O)设备文献:如stdin和stdout分别表达原则输入设备键

盘和原则输出设备显示屏。这两个文献流标记符在Stdio.h系统头文献中有定

义,类型为FILE*,其中文献类型(FILE)也在stdio.h中定义。咱们可以随时

从stdin中读出(即从键盘输入到内存)信息,也可以随时向stdout中写入(从

内存输出到文献)信息。

>外存储设备中保存文献:由顾客命名,并规定访问文献方式。如只容许向其写

入信息输出方式文献,只容许从已有文献中读出信息输入方式文献,又容许写

入又容许读出输入和输出方式文献等。

•文献3种基本访问方式

>输入方式:从文献读出数据到内存变量(数组)中保存。

>输出方式:把内存变量(数组)内容送入到文献中保存。

>既输入又输出方式:对于同一种文献,可以既进行输入又进行输出。

•文献名

给需要使用数据文献所起名字,它涉及文献主名和扩展名两某些。符合命名规

定任何标记符都可以作为主名,如可用gongzi作为工资文献主名。扩展名由1-3

个字符所构成,如可用txt作为一种扩展名。在一种文献名中可以省略扩展名。若

带有扩展名,则用句点与主名分开。如works.ran、工资.bin等。

•文献类型和文献流

在C语言系统中,系统预定义了一种文献类型,文献类型标记符为FILE,当需

要使用一种数据文献时.,必要依照该文献名和访问方式返回一种具备FILE类型指针

值,接着把这个值保存到具备FILE*类型指针变量中,后来就用这个指针变量(文

献流)代替所相应文献,完毕对文献操作。咱们前面提到stdin和stdout分别是

系统定义原则输入和输出文献流。

•文献结束符(EOF)

在每个数据文献结尾都运用一种字节保存一种文献结束标记(T),在stdio.h

中,把T定义为符号常量EOF。

•文献长度

文献中保存数据所占有存储字节数。当一种文献用来保存记录构造数据时,有

时也把保存记录个数称为文献长度,此时文献字节长度等于记录个数乘以记录构造

类型长度。

•数据文献分类

C语句文献按存储信息方式不同可分为字符文献和字节文献两种。字符文献又

称文本文献或ASCII码文献。字节文献又称二进制文献或内部格式文献。

字符文献:文献中保存字符串信息和数值信息都采用字符ASCH码形式。固然

对于中文信息采用2字节中文区位码。如保存常数23时・,相应保存ASCH码为50

和51o

字节文献:文献中保存字符串信息仍采用字符ASCII码形式,而保存数值信息

则采用其内部格式。如保存常数23时,由于它是一种int类型常数,须占用4个字

节,相应保存二进制数为00010111,前面尚有3个字节24个0。

•文献操作函数

涉及打开文献、关闭文献、读取数据、写入数据、移动文献指针位置等,它们

函数原型都保存在系统头文献stdio.h中,调用这些函数时必要通过#include

命令包括此头文献。

二、文献打开和关闭

1.打开数据文献

要访问一种文献,一方面要按照一定方式打开一种文献,并使之与一种文献流

相联系,然后才干进行存取数据操作。当对一种文献解决操作结束后,就把它关闭

掉。

打开一种文献,需要调用C函数库中fopen()函数,得到相相应文献流。该函

数原型为:

FILE*fopen(constchar*fname,constchar*mode);

fname参数:用于指向要打开文献文献名字符串,该字符串内可以带有盘符和

途径名,若省略盘符和途径名则隐含为当前盘和当前程径,即保存当前程序文献磁

盘和途径,

mode参数:用于指定打开文献方式,它也是以字符串形式给出,mode是指向

该字符串指针。

如果调用该函数成功,则返回一种文献指针,即文献名为fname、打开方式mode

所相应文献流,后来就运用它操作文献。如果调用该函数失败,则返回空指针

(NULL),表白没有打开指定文献,不能进行访问操作。

2.打开数据文献方式

打开数据文献方式有如下用字符串表达12中不同方式:

"r"〃打开一种用于输入文本文献,若文献不存在则打开失败

〃打开一种用于输出文本文献,存在清空,不存在则建立

"a"〃打开一种用于向尾部追加输出文本文献,不存在则建立

"rb"〃打开一种用于输入二进制文献,若文献不存在则打开失败

"wb〃〃打开一种用于输出二进制文献,存在清空,不存在则建立

"ab〃〃打开一种用于向尾部追加输出二进制文献,不存在则建立

"r+〃〃打开一种用于读/写操作文本文献,不存在则打开失败

,+"〃打开一种用于读/写操作文本文献,不存在则建立

"a+"〃打开一种用于读/追加写操作文本文献,不存在则建立

“rb+”〃打开一种用于读/写操作二进制文献,不存在则打开失败

“wb+”〃打开一种用于读/写操作二进制文献,不存在则建立

“ab+”〃打开一种用于读/追加写操作二进制文献,不存在则建立

总之:r(read)为读、w(write)为写、b(binary)为二进制、+为读/写

3.打开数据文献举例

(1)FILE*fpl;〃定义一种文献指针变量fpl

fpl=fopenCxxkl.dat\V9;〃以只写方式打开当前程径和目录中

〃本文文献”xxkl.dat”,返回文献流赋给文献指针变量fpl

(2)FILE*fp2=fopen("d:\\C语言练习\\wr.dat","r");//以只读方式

〃打开指定目录内文本文献”wr.dat”,返回文献流赋给fp2

(3)FILE*fp3=fopen("xxk2.ran","wb+”);〃为同步可以进行读/写

〃和二进制操作方式而打开当前目录中“xxk2.ran”文献,

〃返回文献流赋给文献指针变量fp3

4.数据文献关闭

关闭一种文献,需要调用C函数库中fclose()函数,该函数原型为:

intfclose(FILE*fp);

如果fp所相应文献关闭成功则返回0,否则返回-1(EOF)表达失败。

若要关闭已经打开fpl文献流所相应”xxkl.dat”文献,则调用:

fclose(fpl);

打开一种文献并解决结束后,最佳使用fcloseO函数调用关闭它,这样才可以

保证暂时存储在文献缓冲区内容所有写入到外存文献中。

三、文本文献访问操作

1.向文本文献输出数据

调用在stdio.h头文献中声明fputc()函数或fputs()函数。这两个函数原型为:

intfputc(intch,FILE*stream);〃向文献写入一种字符

intfputs(constchar*str,FILE*stream);〃向文献写入一种字符串

fputc函数在操作成功时返回原字符,否则返回

fputs函数在操作成功时返回0,否则返回T。

应用举例

例1向d盘xxk目录下wrl.dat文献依次输出26个小写英文字母。

分析:若d盘上没有xxk目录,则要一方面建立此目录,然后才可以编写C程序使

用此目录建立文献。在程序主函数中,一方面要依照文献名和访问方式打开此文献,

得到相应文献流,接着依次向其写入26个小写英文字母,最后关闭该文献。此题参

照程序如下:

#include<stdio.h>

#include<stdlib.h>

voidmain(void)

(

inti;

FILE*fl;〃定义文献指针以便保存文献流

fl=fopenCd:\\xxk\\wr1.dat","w");〃以写文本方式打开返回文献流

if(fl-NULL){〃当fl相应文献不存在则退出运营

printf("不可以打开文献!\n");

exit(1);

)

for(i=0;i<26;i++)

fputcCa+i,fl);〃向fl文献流输出每个字母

fclose(fl);〃关闭fl所相应文献

}

通过使用操作系统提供记事本窗口可以查看该文献内容。

例2把从键盘上输入若干行文本字符原原本本地存入到d盘xxk目录下wr2.dat文

献中,直到从键盘上输入一空行(即只按下回车键)为止。

分析:此程序主函数同样涉及定义文献流、打开文献、接受键盘输入和写文献、关

闭文献等操作。

#include<stdio.h>

#include<stdlib.h>

ttinclude<string.h>

voidmain(void)

charstr[80];〃定义一种字符数组,保存输入一行字符

FILE*f2;〃定义文献指针对象,用来保存一种文献流

f2=fopen(/zd:\\xxk\\wr2.dat","w");〃以写方式访问文献

if(!f2){〃当f2打开失败时退出运营

printf("CannotopenFile.\nz/);

exit(1);

)

printf("在下面输入若干行文本建立文本文献:\n");

while(1){〃执行while循环

gets(str);〃用str保存从键盘上输入一行字符

strcat(str,"\n");〃在字符串末尾添加一种换行符

if(*str=='\n')break;〃若输入是空串则离开循环

fputs(str,f2);〃把str所指向字符串写入到f2文献

)

fclose(f2);〃关闭f2所相应文献

)

2.从文本文献输入数据

调用在stdio.h头文献中声明fgetcO函数或fgetsO函数。这两个函数原型为:

intfgetc(FILE*stream);

char*fgets(char*str,intlength,FILE*stream);

fgetc函数从文献流中当前字节位置读出一种字符并返回。若读到文献结束标

记则返回

fputs函数从文献流中当前字节位置起读出一行字符(要不大于length长度)

并保存到str字符数组空间,同步返回str值。若没有读到任何内容则返回NULL。

应用举例

例3从上面例1所建立"d:\xxk\wrl.dat”文献中输入所有数据并依次显示到屏幕

上。

分析:该文献保存着26个小写英文字符,以读方式打开该文献后,文献当前访问

位置是文献开始位置,即第1个字节位置,每次读出一种字节内容(字符)后,当

前访问位置自动后移,接着可以读取下一种字符。程序如下:

#include<stdio.h>

#include<stdlib.h>

voidmain(void)

(

charch;

FILE*f3=fopen("d:\\xxk\\wrl.dat","r");〃得到输入文献流

if(!f3){〃当f3打开失败时退出程序运营

printf(??d:\\xxk\\wrl.datfilenotopen!\nz,);

exit(1);

)

ch=fgetc(f3);〃从文献开始处读出一种字符

while(ch!=EOF){//ch不等于文献结束符时则循环

printfch);〃向屏幕窗口输出ch所保存字符

ch=fgetc(f3);〃继续从文献读出一种字符

printf("\n");

fclose(f3);〃关闭f3所相应文献

该程序运营成果如下:

abcdefghijkImnopqrstuvwxyz

例4从上面例2所建立“d:\xxk\wr2.dat”文献中按行读出所有数据,并把它们依

次显示到屏幕上,同步记录出文献内容中行数。

分析:一方面以读方式打开文献返回文献流,接着从文献头开始依次读出每行字符

串并显示输出和计数,最后关闭文献。

#include<stdio.h>

#include<stdlib.h>

voidmain(void)

(

inti=0;〃定义i用来记录行数

charstr[80];〃定义str数组用来保存一行字符串

FILE*f4=fopen("d:\\xxk\\wr2.dat","r");〃得到相应文献流

if(!f4){printf("文献没有打开!\n");exit(l);)

while(!feof(f4))〃文献未结束时执行循环

char*p=fgets(str,80,f4);〃读出一行字符串到str字符数组

if(!p)break;〃若从文献中没有读到内容则退出

printfstr);〃向屏幕输出str所指向字符串

i++;〃行数增1

printf("文本文献中行数为:%d\n/z,i);

fclose(f4);〃关闭f4所相应文献

四、二进制文献访问操作

•读出和写入信息函数

对二进制文献是按固定字节数进行信息读写访问操作。调用在Stdio.h头文献

中声明freadO函数可以从二进制文献中读出固定字节数信息,调用fwriteO函数

可以向二进制文献中写入固定字节数信息。这两个函数原型为:

unsignedintfread(void*buffer,unsignedintnum,

unsignedintcount,FILE*stream);

unsignedintfwrite(constvoid*buffer,unsignedintnum,

unsignedintcount,FILE*stream);

参数阐明:stream参数给出要进行操作二进制文献流,num和count参数分别

表达待读写信息块中一种数据类型长度和个数,它们之积为信息块字节数,buffer

参数所指向存储空间是信息在内存中保存地点。

函数功能:调用fread函数是从stream所示文献中当前字节位置读出

num*count个字节信息并保存到由buffer所指向存储空间中。调用fwrite函数是

把从buffer所指向存储空间中num*count个字节信息写入到由stream所示文献中,

从当前字节位置起向后存储。

•移动文献指针位置(当前待读写字节位置)

在stdio.h头文献中还提供有移动文献指针位置函数:

intfseek(FILE*stream,longintnumintorigin);

功能:运用该函数可以把文献指针位置移动到整个文献中任何字节位置。随时

从这个位置起读写信息。

参数阐明:

stream参数给出要进行操作文献流。

origin参数必要是三个符号常量SEEK_SET、SEEK_CUR或SEEK_END之一。它们

在stdio.h头文献中定义。

SEEK_SET表达文献开始位置,即第1个字节位置;SEEK_END表达文献结尾位

置,即保存文献结束标记位置;SEEK/UR表达当前文献指针位置。

num参数给出移动文献位置指针位移量,为正数时则表达从origin所给参照点

向后移动num个字节,为负数时表达向前移动num个字节,移动后位置就是当前文

献指针位置。

调用该函数时,若文献位置指针移动成功,则返回0,否则返回非0值。

•应用举例

例1编一程序,一方面运用48、62、25、73、66、80、78、54、36、47等10

个整数初始化一种整型数组a[10],接着把a中每个元素值依次写入到二进制文献

“d:\xxk\data.bin”中,然后再对数组a进行升序排序,把排序成果再一次写入到

上述二进制文献中。

分析:一方面以二进制写方式打开给定文献,接着把数组a[10]中数据写入到

文献中,再接着对数组a[10]进行升序排列,最后再把数组a[10]中数据写入到文献

中。对数组a[10]进行升序排列可以单独编写出函数定义。程序如下:

#include<stdio.h>

#include<stdlib.h>

inta[10]={48,62,25,73,66,80,78,54,36,47);〃定义并初始化数组

voidSeleteSort(inta[],intn)〃对数组a[10]进行升序排序

{〃采用选取排序办法

inti,j,k,x;

for(i=l;i<n;i++)(〃顺序比较和互换nT次

k=iT;

for(j=i;j<n;j++)〃k为当前比较区间内最小元素下标

if(a[j]<a[k])k=j;

x=a[i-l];a[i-l]=a[k];a[k]=x;〃互换

voidmain(void)

(

inti;

FILE*fpl;

fpl=fopen("d:\\xxk\\data.bin","wb");〃以二进制写打开文献

if(!fpl){printf("文献没有打开!\n");exit(l);}

for(i=0;i<10;i++)〃向文献写入a数组中每个元素值

fwrite(&a[i],sizeof(int),1,fpl);

SeleteSort(a,10);〃调用排序算法

fwrite(a,sizeof(int),10,fpl);//把数组a[10]一次写入文献

fclose(fpl);〃关闭fpl所相应文献

)

例2从例1所建立二进制文献中,一方面读出文献后半某些保存按升序排列

10个整数并显示,然后再读出前半某些保存10个整数并显示出来。

分析:依照文献名和访问方式定义文献流,移动文献位置指针,读取后10个

有序数据,再把文献指针位置移到文献开始,再读取前10个数据。

#include<stdio.h>

#include<stdlib.h>

inta[10];〃用来保存从文献中读取10个整数

voidmain(void)

(

inti;

FILE*fpl;

fpl=fopen(〃d:\\xxk\\data.bin〃,〃rb〃);〃以二进制读打开文献

if(!fpl){printf(〃文献没有打开!\n〃);exit(l);)

fseek(fpl,10*sizeof(int),SEEKSET);

〃把文献指针位置移到10个整数之后,即第11个整数位置

fread(a,sizeof(int),10,fpl);

〃一次读出后10个整数到a[10]数组中保存

for(i=0;i<10;i++)printf(,z%d〃,a[i]);

〃依次显示出按升序排列10个整数

printf(〃\n〃);

fseek(fpl,0,SEEKSET);〃把文献位置指针移到文献开始位置

for(i=0;i<10;i++){〃依次读出并显示前10个整数

fread(&a[i],sizeof(int),1,fpl);

printf(〃%d〃,a[i]);

printf(〃\n〃);

fclose(fpl);〃关闭fpl所相应文献

程序运营成果:

25364748546266737880

48622573668078543647

例3编一程序,从键盘上输入若干条Pupil类型学生记录到“Student.bin”

二进制文献中,当输入姓名为〃AAA〃后结束。假定Pupil类型包括两个域,即学生姓

名和成绩。

分析:定义文献流、从键盘输入和向文献流写入每个学生记录、关闭文献。

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

structPupil{charname[10];intgrade;};〃定义学生记录构造

structPupilx;〃定义学生构造变量

voidmain(void){

char*p=〃Student.bin”;〃定义文献名字符串

FILE*fpl=fopen(p,〃wb〃);〃以二进制写方式打开文献

if(!fpl){printf(〃文献没有打开,退出运营!\n〃);exit(1);)

printf(〃请输入若干条学生记录,输入姓名AAA后结束:\n〃);

while(1){

scanf(〃%s〃,x.name);〃输入姓名

if(strcmp(x.name,〃AAA〃)=0)break;〃输入结束退出循环

scanf(〃淑1〃,&x,grade);〃输入成绩

fwrite(&x,sizeof(x),1,fpl);〃向文献写入一条记录

fclose(fpl);

printf("数据输入完毕,程序正常结束.\n");

)

假定从键盘上输入和显示成果如下:

请输入若干条学生记录,输入姓名AAA后结束:

zhshj76

hgyin84

shian68

zhb92

zjmin70

xjip63

AAA

数据输入完毕,程序正常结束.

此6条学生记录被依次保存到“Student.bin”二进制文献中,每个记录所占有

字节数为sizeof(structPupil)>这个文献占有6*sizeof(structPupil)+1字节。

例4编一程序,从例3建立“Student,bin”二进制文献中,依次读出每个Pupil

类型学生成绩记录,并输出出来,同步记录出学生记录数。

#include<stdio.h>

#include<stdlib.h>

structPupil{charname[10];intgrade;);〃学生类型定义

voidPrint(FILE*fio);〃打印输出文献中所有记录

intCount(FILE*fio);〃记录出文献中所有记录数

voidmain(void)

FILE*fio=fopen("Student,bin”,〃rb+〃);

〃以二进制读写方式打开文献

if(!fio){

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论