文件操作“打开”fopen
文件指针名=fopen(文件名,使用文件方式)
FILE *fp;
fp=("file a","r");
意义:在当前目录下打开文件file a进行“读”操作,并使fp指向该文件。
FILE *fp
fp=("c:\\test","rb")
意义:打开C盘的根目录下的文件test, 这是一个二进制文件,只允许按二进制方式进行读操作
文件使用方式说明
r(read): 读
w(write): 写
a(append): 追加
t(text): 文本文件,可省略不写
b(banary): 二进制文件
打开文件的程序段
if((fp=fopen("c:\\test","rb")==NULL)
{
printf("\n error on open c:\\test file!");
getch(); //从键盘输入一个字符,但不在屏幕上显示
exit(1); //敲键后执行exit(1)退出程序
}
关闭函数 fclose
fclose(文件指针);
fclose(fp); 正常完成关闭文件操作时,fclose函数返回值为0。
多种读写函数
头文件<stdio.h>
·字符读写函数 :fgetc和fputc
·字符串读写函数:fgets和fputs
·数据块读写函数:freed和fwrite
·格式化读写函数:fscanf和fprinf
fgetc:字符变量=fgetc(文件指针)
注意:文件指针是指向整个文件的,须在程序中定义说明,只要不重新赋值,文件指针的值是不变的。文件内部的位置指针用以指示文件内部的当前读写位置,每读写一次,该指针均向后移动,它不需在程序中定义说明,而是由系统自动设置的。
//例如ch=fgetc(fp);其意义是从打开的文件fp中读取一个字符并送入ch中。
//读入文件test.c,在屏幕上输出。
#include<stdio.h>
main() //从文件中逐个读取字符,在屏幕上显示
{
FILE *fp;
char ch;
if((fp=fopen("test.c","rt"))==NULL)
{
printf("Cannot open file strike any key exit!");
getch();
exit(1);
}
ch=fgetc(fp);
while (ch!=EOF) //直到读取到文件的末尾结束(EOF)标志
{
putchar(ch);
ch=fgetc(fp); //下一个字符
}
fclose(fp);
}
写字符函数fputc
fputc(字符量,文件指针); 把一个字符写入指定的文件中
注意:
1. 每写入一个字符,文件内部位置指针向后移动一个字节。
2. fputc函数有一个返回值,如写入成功则返回写入的字符, 否则返回一个EOF。可用此来判断写入是否成功。
//从键盘输入一行字符,写入一个文件, 再把该文件内容读出显示在屏幕上
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
main()
{
FILE *fp;
char ch;
if ((fp = fopen("E: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); //字符写入到fp文件指针中
ch = getchar(); //输入下一个字符 (循环结束即文件内部指针指向末尾)
}
rewind(fp); // 文件内部位置指针移向头部
ch = fgetc(fp);
while (ch != EOF)
{
putchar(ch);
ch = fgetc(fp); //依次读一个字符然后输出
}
printf("\n");
fclose(fp);
}
读字符串函数fgets
fgets(字符数组名,n,文件指针);
fgets(str,n,fp) 表示:从fp所指的文件中读出n-1个字符送入字符数组str中;
注意:
1. 在读出n-1个字符之前,如遇到了换行符或EOF,则读出结束。
2. fgets函数也有返回值,其返回值是字符数组的首地址。
//从test.c文件中读入一个含10个字符的字符串
#include<stdio.h>
int main()
{
FILE *fp;
char str[11];
if ((fp = fopen("test.c", "rt")) == NULL)
{
printf("不能打开文件");
getch();
exit(1);
}
fgets(str, 10, fp);
printf("%s", str[11]);
fclose(fp);
}
写字符串函数fputs
fputs(“aaaa“,fp); 意义:把字符串“aaaa”写入fp所指的文件之中。
#include<stdio.h>
int main()
{
FILE *fp;
char ch , str[20];
if ((fp = fopen("test.c", "at+")) == NULL)
{ //以追加读写文本文件的方式打开文件
printf("不能打开文件");
getch();
exit(1);
}
printf("请输入一个字符串");
scanf("%s", str);
fputs(str, fp);
rewind(fp);
getchar(fp);
while (ch != EOF)
{
putchar(fp);
getchar(fp);
}
printf("\n");
fclose(fp);
}
fread(buffer,size,count,fp);
fwrite(buffer,size,count,fp);
其中buffer是一个指针,在fread函数中,它表示存放输入数据的首地址。在fwrite函数中,它表示存放输出数据的首地址。 size 表示数据块的字节数。count 表示要读写的数据块块数。fp 表示文件指针。
//从键盘输入两个学生数据,写入一个文件中,
//再读出这两个学生的数据显示在屏幕上。
#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);
}