文件的操作(顺序读写)

文件

概念:指存储在外部设备介质上的数据的集合。
feof:文件有一个指针指向文件的末尾

常用函数

//w r w+ r+  wb  rb  a
//打开文件,成功返回流文件指针,错误返回NULL
  FILE *fopen( const char *fname, const char *mode );
//文件到达末尾是返回一个非零值
 int feof( FILE *stream );

声明

平时说的对数据进行输入输出操作,并不是直接向文件或磁盘输入和输出,而是向流对象操作,输入和输出到流对象,流对象则向磁盘和文件输入和读取。

文件的操作(顺序读写)_第1张图片

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、关闭文件,若对输出到文件后一定要关闭文件指针,不然数据不会输出到文件.

文件的操作(顺序读写)_第2张图片

输入输出函数及分类

处理字符文件的函数

//二者比较记忆
//往屏幕输出
//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();

你可能感兴趣的:(c)