概念:指存储在外部设备介质上的数据的集合。
feof:文件有一个指针指向文件的末尾
//w r w+ r+ wb rb a
//打开文件,成功返回流文件指针,错误返回NULL
FILE *fopen( const char *fname, const char *mode );
//文件到达末尾是返回一个非零值
int feof( FILE *stream );
声明
平时说的对数据进行输入输出操作,并不是直接向文件或磁盘输入和输出,而是向
流对象
操作,输入和输出到流对象,流对象则向磁盘和文件输入和读取。
1、数据不是直接和文件或磁盘操作,通过流对象实现
2、输入和输出都是站在程序的角度来说明,程序进行输入数据和程序进行输出数据
分类
1、ascll文件,称为文本文件(又称字符文件),存储方式以字符存储(会把二进制文件转换为字符),字符流.如(数值、ascll文件)
2、二进制文件,存储方式以二进制存储,字节流.如数值
文件指针
通过指针来指向一个文件,即文件描述符。文件描述符的本质是一个指针,指针指向了一个FILE类型,该类型为结构体类型,结构体中包含了文件的属性
// FILE *pf;
struct _iobuf {
char *_ptr;
int _cnt;
char *_base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char *_tmpfname;
};
typedef struct _iobuf FILE;
操作步骤
1、打开文件,
成功返回文件描述符(文件指针) ,判断是否为空,打开失败
2、进行操作,读写
3、关闭文件,若对输出到文件后一定要关闭文件指针,不然数据不会输出到文件.
处理字符文件的函数
//二者比较记忆
//往屏幕输出
//printf(输出格式,输出列表);
//从键盘输入
//scanf(输入格式,输入列表);
fprintf(文件指针,输出格式,输出列表);
fscanf(文件指针,输入格式,输入列表);
//重定向了输出和输入的方向—-文件
#include
#include
#include
int main()
{
int ar[]={1,2,3,4,5,6,7,8,9,10};
FILE *pf1=NULL;
//打开文件
pf1=fopen("1.txt","w");
//打开成功,返回文件描述符(文件指针),失败返回NULL
if(NULL == pf1)
{
printf("Open File fail.\n");
exit(1);
}
//数据处理,输出到文件
else
{
for(int i=0;i<10;i++)
{
fprintf(pf1,"%d ",ar[i]);
}
}
//关闭文件描述符
fclose(pf1);
//定义文件指针
FILE *pf=NULL;
//打开文件
pf =fopen("1.txt","r");
//判断是否打开文件,成功返回文件描述符,失败返回NULL
if(NULL == pf)
{
printf("Open File Fail.\n");
exit(1);
}
//数据输入
else
{
for(int i=0;i<10;i++)
{
fscanf(pf,"%d",&ar[i]);
}
for(i=0;i<10;i++)
{
printf("%d ",ar[i]);
}
}
fclose(pf);
return 0;
}
//一个字符一个字符存取 c----char
//getc();
//putc();
fputc(字符,文件指针);
fget(文件指针);
#include
#include
int main()
{
char *str="Hello World";
FILE *pf=fopen("2.txt","w");
if(NULL == pf)
{
printf("Open File Fail\n");
exit(1);
}
else
{
/*
while(fputc(*str,pf) != '\0')
{
str++;
}*/
while(*str != '\0')
{
fputc(*str,pf);
str++;
}
}
fclose(pf);
FILE *pf1=fopen("2.txt","r");
if(NULL == pf1)
{
printf("Open File Fail.\n");
exit(1);
}
else
{
char ch=getc(pf1);
while( ch != EOF)
{
printf("%c",ch);
ch=getc(pf1);
}
printf("\n");
}
fclose(pf1);
return 0;
}
//存取字符串 s-----string
//把字符串str,输出到文件指针,成功返回非负数,失败EOF
int fputs( const char *str, FILE *stream );
//从文件中输入num-1个字符到*str,成功返回字符串 失败返回NULL
char *fgets( char *str, int num, FILE *stream );
#include
#include
int main()
{
char *str="Hello World";
//打开文件
FILE *pf=fopen("3.txt","w");
//判断
if(NULL == pf)
{
printf("Open File Fail\n");
exit(1);
}
//输出
else
{
fputs(str,pf);
}
//关闭
fclose(pf);
//打开
FILE *pf1=fopen("3.txt","r");
判断
if(NULL == pf1)
{
printf("Open File Fail.\n");
exit(1);
}
//输入
else
{
char buffer[256];
//feof判断文件是否结束
while(!feof(pf1))
{
fgets(buffer,256,pf1);
printf("%s",buffer);
}
printf("\n");
}
//关闭
fclose(pf1);
return 0;
}
处理二进制文件的函数
1、二进制文读写读文件没有破坏,直接对内存的拷贝
2、二进制文件可以存储任何形式的文件(照片)
3、二进制文件和字符文件区别,属性不同(w,wb,r,rb)
4、二进制文件看着是乱码,其实是数值
//从buffer缓存区中取出,size_t size类型的count个,存入流,返回已写对象的数 int fwrite( const void *buffer,
size_t size, size_t count, FILE *stream );
//从流中读取siez_t size 类型的sum个,存放到buffer中,返回取出的字符数目
int fread( void *buffer
, size_t size, size_t num, FILE *stream
#include
#include
int main()
{
int ar[10]={1,2,3,4,5,6,7,8,9,10};
int buffer[10];
FILE *pf=fopen("5.txt","wb");
FILE *pf1=fopen("5.txt","rb");
if(NULL == pf)
{
printf("Open File Fail.\n");
exit(1);
}
if(NULL == pf1)
{
printf("Open File Fail.\n");
exit(1);
}
//将ar中的10个sizeof(int) 输出
fwrite(ar,sizeof(int),10,pf);
//pf1所指文件,从中读出sizeof(int)*count大小空间 到buffer中
while(!feof(pf1))
{
fread(buffer,sizeof(int),10,pf1);
printf("%s",buffer);
}
return 0;
}
//把一张图片进行复制
#include
#include
int main()
{
FILE *pf=fopen("1.png","rb");
if(NULL == pf)
{
printf("Open File Fail.\n");
exit(1);
}
FILE *pf1=fopen("2.png","wb");
if(NULL == pf1)
{
printf("Open File Fail.\n");
exit(1);
}
char buffer[256];
fread(buffer,sizeof(char),256,pf);
//文件没有读到末尾就继续读取
while(!feof(pf))
{
fread(buffer,sizeof(char),256,pf);
fwrite(buffer,sizeof(char),256,pf1);
}
//关闭流
fclose(pf);
fclose(pf1);
return 0;
}
打开
fopen();
关闭
fclose();
判断到末尾
feof();
字符文件(文本文件)操作:
fprintf(); fscanf();
fputc(); fgetc();
fputs(); fgets();
二进制文件操作:
fread(); fwrite();