C文件的C文件操作

发布网友 发布时间:2022-04-23 05:39

我来回答

1个回答

热心网友 时间:2023-09-16 21:30

在C语言中,文件操作都是由库函数来完成的,下面就是一些常用操作及函数:
需要包含头文件:stdio.h 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(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(字符量,文件指针);
[例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(字符数组名,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函数也有返回值,其返回值是字符数组的首地址。 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函数与前面使用的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.6相比,本程序中fscanf和fprintf函数每次只能读写一个结构数组元素,因此采用了循环语句来读写全部数组元素。还要注意指针变量pp,qq由于循环改变了它们的值,因此在程序的25和32行分别对它们重新赋予了数组的首地址。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com