C文件操作

      C语言将文件看作是一个字符字节)的序列,即一个一个字符(字节)的数据顺序组成。根据数据的组成形式,可分为ASCII文件和二进制文件。ASCII文件又称文本(text)文件,它的每一个字节可放一个ASCII码,代表一个字符。二进制文件是把内存中的数据按其在内存中的存储形式按原样输出到磁盘上存放。因而一个C文件就是一个字节流或二进制流。它把数据看作是一连串的字符(字节),而不考虑记录的界限。换句话说,C语言中文件不是由记录(record)组成的(这是和PASCAL或其他高级语言不同的)。在C语言中对文件的存取是以字符(字节)为单位的。输出输入的数据流的开始和结束仅受程序控制而不受物理符号(如回车换行符)控制。也就是说,在输出时不会自动增加回车换行符作为记录结束的标志,输入时不以回车换行符作为记录的间隔(事实上C文件并不是由记录构成的)。把这种文件称为流式文件。C语言允许对文件存取一个字符,这就增加了处理的灵活性。

在C语言中,文件操作都是由 库函数来完成的,下面就是一些常用操作及函数:
需要包含头文件:stdio.h

fopen:打开

fopen函数用来打开一个文件,其调用的一般形式为: 文件指针名=fopen(文件名,打开方式) 其中,例如:
FILE *fp;
fp=fopen("file.a","r");
其意义是在 当前目录下打开文件file a,只允许进行“读”操作,并使fp指向该文件。
打开方式主要有以下若干类:
r:只读打开一个文本文件,只允许读数据
w:只写打开或建立一个文本文件,只允许写数据
a:追加打开一个文本文件,并在文件末尾写数据
t:以 文本的方式打开文件
b:以二进制的方式打开文件
+:可读可写
另外
rt+:读写打开一个文本文件,允许读和写
wt+:读写打开或建立一个文本文件,允许读写
at+:读写打开一个文本文件,允许读,或在文件末追加数据
rb+:读写打开一个 二进制文件,允许读和写
wb+:读写打开或建立一个 二进制文件,允许读和写
ab+:读写打开一个 二进制文件,允许读,或在文件末追加数据
判断打开是否成功:
if((fp=fopen("c:\\hzk16","rb")==NULL)
{
printf("\nerror on open c:\\hzk16 file!");
exit(-1);
}

fclose:关闭文件

调用的一般形式是: fclose( 文件指针); 例如:
fclose(fp);
正常完成关闭文件操作时,fclose函数返回值为0。如返回非零值则表示有错误发生。

fgetc:读字符(很少用)

fgetc函数的功能是从指定的文件中读一个字符, 函数调用的形式为:
可参考下例:
[例10.1]读入文件e10-1.c,在 屏幕上输出。
#include<stdio.h>
main()
{
FILE *fp;
char ch;
if((fp=fopen("e10_1.c","rt"))==NULL)
{
printf("Cannot open file strike any key exit!");
getch();
exit(1);
}
ch=fgetc(fp);
while (ch!=EOF)
{
putchar(ch);
ch=fgetc(fp);
}
fclose(fp);
}

fputc:向文件写字符(很少用)

fputc函数的功能是把一个字符写入指定的文件中, 函数调用的形式为: fputc(字符量, 文件指针);
[例10.2]从键盘输入一行 字符,写入一个文件, 再把该文件内容读出显示在屏幕上。
参考下例:
#include<stdio.h>
main()
{
FILE *fp;
char ch;
if((fp=fopen("string","wt+"))==NULL)
{
printf("Cannot open file strike any key exit!");
getch();
exit(1);
}
printf("input a string:\n");
ch=getchar();
while (ch!='\n')
{
fputc(ch,fp);
ch=getchar();
}
rewind(fp);
ch=fgetc(fp);
while(ch!=EOF)
{
putchar(ch);
ch=fgetc(fp);
}
printf("\n");
fclose(fp);
}

fgets:读取字符串

从指定的文件中读一个字符串到字符 数组中, 函数调用的形式为: fgets(字符数组名,n, 文件指针);其中的n是一个正整数。表示从文件中读出的字符串不超过 n-1个字符。在读入的最后一个字符后加上串结束标志'\0'。例如:fgets(str,n,fp);的意义是从fp所指的文件中读出n-1个字符送入字符 数组str中。
[例10.4]从e10_1.c文件中读入一个含10个 字符字符串。
#include<stdio.h>
main()
{
FILE *fp;
char str[11];
if((fp=fopen("e10_1.c","rt"))==NULL)
{
printf("Cannot open file strike any key exit!");
getch();
exit(1);
}
fgets(str,11,fp);
printf("%s",str);
fclose(fp);
}
本例定义了一个字符 数组str共11个 字节,在以读文本文件方式打开文件e101.c后,从中读出10个字符送入str数组,在数组最后一个单元内将加上'\0',然后在 屏幕上显示输出str数组。输出的十个 字符正是例10.1程序的前十个字符。
对fgets函数有两点说明:
1. 在读出n-1个字符之前,如遇到了换行符或EOF,则读出结束。
2. fgets函数也有返回值,其返回值是字符 数组的首地址。

fputs:向文件写一个字符串

puts函数的功能是向指定的文件写入一个字符串,其调用形式为: fputs(字符串, 文件指针) 其中字符串可以是 字符串常量,也可以是字符 数组名,或指针  变量,例如:
fputs(“abcd“,fp);
其意义是把字符串“abcd”写入fp所指的文件之中。[例10.5]在例10.2中建立的文件string中追加一个字符串。
#include<stdio.h>
main()
{
FILE *fp;
char ch,st[20];
if((fp=fopen("string","at+"))==NULL)
{
printf("Cannot open file strike any key exit!");
getch();
exit(1);
}
printf("input a string:\n");
scanf("%s",st);
fputs(st,fp);
rewind(fp);
ch=fgetc(fp);
while(ch!=EOF)
{
putchar(ch);
ch=fgetc(fp);
}
printf("\n");
fclose(fp);
}
本例要求在string文件末加写字符串,因此,在程序第6行以追加读写文本文件的方式打开文件string 。 然后输入字符串, 并用fputs函数把该串写入文件string。在程序15行用rewind函数把文件内部位置 指针移到文件首。 再进入循环逐个显示 当前文件中的全部内容。fread/fwrite:文件块读写(二进制读写利器) C语言还提供了用于整块数据的读写函数。 可用来读写一组数据,如一个 数组元素,一个结构 变量的值等。读 数据块 函数调用的一般形式为: fread(buffer,size,count,fp); 写数据块函数调用的一般形式为: fwrite(buffer,size,count,fp); 其中buffer是一个 指针,在fread函数中,它表示存放输入数据的首地址。在fwrite函数中,它表示存放输出数据的首地址。 size 表示 数据块的字节数。count 表示要读写的数据块块数。fp 表示 文件指针
例如:
fread(fa,4,5,fp); 其意义是从fp所指的文件中,每次读4个 字节(一个实数)送入实 数组fa中,连续读5次,即读5个实数到fa中。
[例10.6]从键盘输入两个学生数据,写入一个文件中, 再读出这两个学生的数据显示在 屏幕上。
#include<stdio.h>
struct stu
{
char name[10];
int num;
int age;
char addr[15];
}boya[2],boyb[2],*pp,*qq;
main()
{
FILE *fp;
char ch;
int i;
pp=boya;
qq=boyb;
if((fp=fopen("stu_list","wb+"))==NULL)
{
printf("Cannot open file strike any key exit!");
getch();
exit(1);
}
printf("\ninput data\n");
for(i=0;i<2;i++,pp++)
scanf("%s%d%d%s",pp->name,&pp->num,&pp->age,pp->addr);
pp=boya;
fwrite(pp,sizeof(struct stu),2,fp);
rewind(fp);
fread(qq,sizeof(struct stu),2,fp);
printf("\n\nname\tnumber age addr\n");
for(i=0;i<2;i++,qq++)
printf("%s\t%5d%7d%s\n",qq->name,qq->num,qq->age,qq->addr);
fclose(fp);
}
本例程序定义了一个结构stu,说明了两个结构 数组boya和 boyb以及两个结构 指针变量pp和qq。pp指向boya,qq指向boyb。程序第16行以读写方式打开 二进制文件“stu_list”,输入二个学生数据之后,写入该文件中, 然后把文件内部位置 指针移到文件首,读出两块学生数据后,在 屏幕上显示。

fscanf/fprintf:格式化读写函数

fscanf函数,fprintf函数与前面使用的scanf和printf 函数的功能相似,都是格式化读写函数。 两者的区别在于 fscanf 函数和fprintf函数的读写对象不是键盘和显示器,而是磁盘文件。这两个函数的调用格式为: fscanf( 文件指针,格式字符串, 输入表列); fprintf(文件指针,格式字符串, 输出表列); 例如:
fscanf(fp,"%d%s",&i,s);
fprintf(fp,"%d%c",j,ch);
用fscanf和fprintf函数也可以完成例10.6的问题。修改后的程序如例10.7所示。
[例10.7]
#include<stdio.h>
struct stu
{
char name[10];
int num;
int age;
char addr[15];
}boya[2],boyb[2],*pp,*qq;
main()
{
FILE *fp;
char ch;
int i;
pp=boya;
qq=boyb;
if((fp=fopen("stu_list","wb+"))==NULL)
{
printf("Cannot open file strike any key exit!");
getch();
exit(1);
}
printf("\ninput data\n");
for(i=0;i<2;i++,pp++)
scanf("%s%d%d%s",pp->name,&pp->num,&pp->age,pp->addr);
pp=boya;
for(i=0;i<2;i++,pp++)
fprintf(fp,"%s %d %d %s\n",pp->name,pp->num,pp->age,pp->
addr);
rewind(fp);
for(i=0;i<2;i++,qq++)
fscanf(fp,"%s %d %d %s\n",qq->name,&qq->num,&qq->age,qq->addr);
printf("\n\nname\tnumber age addr\n");
qq=boyb;
for(i=0;i<2;i++,qq++)
printf("%s\t%5d %7d %s\n",qq->name,qq->num, qq->age,
qq->addr);
fclose(fp);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值