中央电大C语言A课程辅导Word文档下载推荐.docx
- 文档编号:17760949
- 上传时间:2022-12-09
- 格式:DOCX
- 页数:13
- 大小:22.61KB
中央电大C语言A课程辅导Word文档下载推荐.docx
《中央电大C语言A课程辅导Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《中央电大C语言A课程辅导Word文档下载推荐.docx(13页珍藏版)》请在冰豆网上搜索。
●文件长度
文件中保存数据所占有的存储字节数。
当一个文件用来保存记录结构的数据时,有时也把保存的记录个数称为文件长度,此时的文件字节长度等于记录个数乘以记录结构类型的长度。
●数据文件分类
C语句文件按存储信息方式的不同可分为字符文件和字节文件两种。
字符文件又称文本文件或ASCII码文件。
字节文件又称二进制文件或内部格式文件。
字符文件:
文件中保存的字符串信息和数值信息都采用字符的ASCII码的形式。
当然对于汉字信息采用2字节的汉字区位码。
如保存常数23时,对应保存的ASCII码为50和51。
字节文件:
文件中保存的字符串信息仍采用字符的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"
//打开一个用于输入的文本文件,若文件不存在则打开失败
w"
//打开一个用于输出的文本文件,存在清空,不存在则建立
a"
//打开一个用于向尾部追加输出的文本文件,不存在则建立
rb"
//打开一个用于输入的二进制文件,若文件不存在则打开失败
wb"
//打开一个用于输出的二进制文件,存在清空,不存在则建立
ab"
//打开一个用于向尾部追加输出的二进制文件,不存在则建立
r+"
//打开一个用于读/写操作的文本文件,不存在则打开失败
w+"
//打开一个用于读/写操作的文本文件,不存在则建立
a+"
//打开一个用于读/追加写操作的文本文件,不存在则建立
rb+"
//打开一个用于读/写操作的二进制文件,不存在则打开失败
wb+"
//打开一个用于读/写操作的二进制文件,不存在则建立
ab+"
//打开一个用于读/追加写操作的二进制文件,不存在则建立
总之:
r(read)为读、w(write)为写、b(binary)为二进制、+为读/写
3.打开数据文件举例
(1)FILE*fp1;
//定义一个文件指针变量fp1
fp1=fopen("
xxk1.dat"
"
);
//以只写方式打开当前路径和目录中
//的本文文件"
返回的文件流赋给文件指针变量fp1
(2)FILE*fp2=fopen("
d:
\\C语言练习\\wr.dat"
//以只读方式
//打开指定目录内的文本文件"
wr.dat"
返回的文件流赋给fp2
(3)FILE*fp3=fopen("
xxk2.ran"
//为同时能够进行读/写
//和二进制操作方式而打开当前目录中的"
文件,
//返回的文件流赋给文件指针变量fp3
4.数据文件的关闭
关闭一个文件,需要调用C函数库中的fclose()函数,该函数的原型为:
intfclose(FILE*fp);
如果fp所对应的文件关闭成功则返回0,否则返回-1(EOF)表示失败。
若要关闭已经打开的fp1文件流所对应的"
文件,则调用:
fclose(fp1);
打开一个文件并处理结束后,最好使用fclose()函数调用关闭它,这样才能够保证临时存储在文件缓冲区的内容全部写入到外存的文件中。
三、文本文件的访问操作
1.向文本文件输出数据
调用在stdio.h头文件中声明的fputc()函数或fputs()函数。
这两个函数的原型为:
intfputc(intch,FILE*stream);
//向文件写入一个字符
intfputs(constchar*str,FILE*stream);
//向文件写入一个字符串
fputc函数在操作成功时返回原字符,否则返回-1。
fputs函数在操作成功时返回0,否则返回-1。
应用举例
例1向d盘xxk目录下的wr1.dat文件依次输出26个小写英文字母。
分析:
若d盘上没有xxk目录,则要首先建立此目录,然后才能够编写C程序使用此目录建立文件。
在程序的主函数中,首先要根据文件名和访问方式打开此文件,得到对应的文件流,接着依次向其写入26个小写英文字母,最后关闭该文件。
此题的参考程序如下:
#include<
stdio.h>
stdlib.h>
voidmain(void)
{
inti;
FILE*f1;
//定义文件指针以便保存文件流
f1=fopen("
\\xxk\\wr1.dat"
"
//以写文本方式打开返回文件流
if(f1==NULL){//当f1对应的文件不存在则退出运行
printf("
不能够打开文件!
\n"
exit
(1);
}
for(i=0;
i<
26;
i++)
fputc('
a'
+i,f1);
//向f1文件流输出每个字母
fclose(f1);
//关闭f1所对应的文件
经过使用操作系统提供的记事本窗口能够查看该文件的内容。
例2把从键盘上输入的若干行文本字符原原本本地存入到d盘xxk目录下的wr2.dat文件中,直到从键盘上输入一空行(即只按下回车键)为止。
此程序的主函数同样包括定义文件流、打开文件、接收键盘输入和写文件、关闭文件等操作。
string.h>
charstr[80];
//定义一个字符数组,保存输入的一行字符
FILE*f2;
//定义文件指针对象,用来保存一个文件流
f2=fopen("
\\xxk\\wr2.dat"
//以写方式访问文件
if(!
f2){//当f2打开失败时退出运行
CannotopenFile.\n"
在下面输入若干行文本建立文本文件:
\n"
while
(1){//执行while循环
gets(str);
//用str保存从键盘上输入的一行字符
strcat(str,"
//在字符串的末尾添加一个换行符
if(*str=='
\n'
)break;
//若输入的是空串则离开循环
fputs(str,f2);
//把str所指向的字符串写入到f2文件
fclose(f2);
//关闭f2所对应的文件
2.从文本文件输入数据
调用在stdio.h头文件中声明的fgetc()函数或fgets()函数。
intfgetc(FILE*stream);
char*fgets(char*str,intlength,FILE*stream);
fgetc函数从文件流中的当前字节位置读出一个字符并返回。
若读到文件结束标记则返回-1。
fputs函数从文件流中的当前字节位置起读出一行字符(要小于length长度)并保存到str字符数组空间,同时返回str值。
若没有读到任何内容则返回NULL。
例3从上面例1所建立的”d:
\xxk\wr1.dat”文件中输入全部数据并依次显示到屏幕上。
该文件保存着26个小写英文字符,以读方式打开该文件后,文件当前访问位置是文件开始位置,即第1个字节的位置,每次读出一个字节内容(字符)后,当前访问位置自动后移,接着能够读取下一个字符。
程序如下:
charch;
FILE*f3=fopen("
//得到输入文件流
f3){//当f3打开失败时退出程序运行
\\xxk\\wr1.datfilenotopen!
ch=fgetc(f3);
//从文件开始处读出一个字符
while(ch!
=EOF){//ch不等于文件结束符时则循环
printf("
%c"
ch);
//向屏幕窗口输出ch所保存的字符
ch=fgetc(f3);
//继续从文件读出一个字符
fclose(f3);
//关闭f3所对应的文件
该程序运行结果如下:
abcdefghijklmnopqrstuvwxyz
例4从上面例2所建立的”d:
\xxk\wr2.dat”文件中按行读出全部数据,并把它们依次显示到屏幕上,同时统计出文件内容中的行数。
首先以读方式打开文件返回文件流,接着从文件头开始依次读出每行字符串并显示输出和计数,最后关闭文件。
inti=0;
//定义i用来统计行数
charstr[80];
//定义str数组用来保存一行字符串
FILE*f4=fopen("
//得到对应的文件流
f4){printf("
文件没有打开!
}
while(!
feof(f4))//文件未结束时执行循环
char*p=fgets(str,80,f4);
//读出一行字符串到str字符数组
if(!
p)break;
//若从文件中没有读到内容则退出
%s"
str);
//向屏幕输出str所指向的字符串
i++;
//行数增1
文本文件中的行数为:
%d\n"
i);
fclose(f4);
//关闭f4所对应的文件
●读出和写入信息的函数
对二进制文件是按固定字节数进行信息读写访问操作的。
调用在stdio.h头文件中声明的fread()函数能够从二进制文件中读出固定字节数的信息,调用fwrite()函数能够向二进制文件中写入固定字节数信息。
unsignedintfread(void*buffer,unsignedintnum,
unsignedintcount,FILE*stream);
unsignedintfwrite(constvoid*buffer,unsignedintnum,
参数说明:
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_CUR表示当前的文件指针位置。
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]进行升序排列能够单独编写出函数定义。
inta[10]={48,62,25,73,66,80,78,54,36,47};
//定义并初始化数组
voidSeleteSort(inta[],intn)//对数组a[10]进行升序排序
{//采用选择排序方法
inti,j,k,x;
for(i=1;
i<
n;
i++){//顺序比较和交换n-1次
k=i-1;
for(j=i;
j<
j++)//k为当前比较区间内的最小元素下标
if(a[j]<
a[k])k=j;
x=a[i-1];
a[i-1]=a[k];
a[k]=x;
//交换
}
FILE*fp1;
\\xxk\\data.bin"
//以二进制写打开文件
fp1){printf("
10;
i++)//向文件写入a数组中每个元素值
fwrite(&
a[i],sizeof(int),1,fp1);
SeleteSort(a,10);
//调用排序算法
fwrite(a,sizeof(int),10,fp1);
//把数组a[10]一次写入文件
//关闭fp1所对应的文件
例2从例1所建立的二进制文件中,首先读出文件后半部分保存的按升序排列的10个整数并显示,然后再读出前半部分保存的10个整数并显示出来。
根据文件名和访问方式定义文件流,移动文件位置指针,读取后10个有序数据,再把文件指针位置移到文件开始,再读取前10个数据。
inta[10];
//用来保存从文件中读取的10个整数
//以二进制读打开文件
fseek(fp1,10*sizeof(int),SEEK_SET);
//把文件指针位置移到10个整数之后,即第11个整数位置
fread(a,sizeof(int),10,fp1);
//一次读出后10个整数到a[10]数组中保存
i++)printf("
%d"
a[i]);
//依次显示出按升序排列的10个整数
fseek(fp1,0,SEEK_SET);
//把文件位置指针移到文件开始位置
i++){//依次读出并显示前10个整数
fread(&
fclose(fp1);
程序运行结果:
25364748546266737880
48622573668078543647
例3编一程序,从键盘上输入若干条Pupil类型的学生记录到”Student.bin”二进制文件中,当输入姓名为"
AAA"
后结束。
假定Pupil类型包含两个域,即学生姓名和成绩。
定义文件流、从键盘输入和向文件流写入每个学生记录、关闭文件。
structPupil{charname[10];
intgrade;
};
//定义学生记录结构
structPupilx;
//定义学生结构变量
voidmain(void){
char*p="
Student.bin"
;
//定义文件名字符串
FILE*fp1=fopen(p,"
//以二进制写方式打开文件
文件没有打开,退出运行!
请输入若干条学生记录,输入姓名AAA后结束:
while
(1){
scanf("
x.name);
//输入姓名
if(strcmp(x.name,"
)==0)break;
//输入结束退出循环
%d"
&
x.grade);
//输入成绩
x,sizeof(x),1,fp1);
//向文件写入一条记录
数据输入完成,程序正常结束.\n"
假定从键盘上输入和显示结果如下:
请输入若干条学生记录,输入姓名AAA后结束:
zhshj76
hgyin84
shian68
zhb92
zjmin70
xjip63
AAA
数据输入完成,程序正常结束.
此6条学生记录被依次保存到”Student.bin”二进制文件中,每个记录所占有的字节数为sizeof(structPupil),这个文件占有6*sizeof(structPupil)+1字节。
例4编一程序,从例3建立的”Student.bin”二进制文件中,依次读出每个Pupil类型的学生成绩记录,并输出出来,同时统计出学生记录数。
//学生类型的定义
voidPrint(FILE*fio);
//打印输出文件中的全部记录
intCount(FILE*fio);
//统计出文件中的全部记录数
FI
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中央电大 语言 课程 辅导