zoukankan      html  css  js  c++  java
  • fopenfreadfwritefseed函数的使用

    使用 <stdio.h> 头文件中的 fopen() 函数即可打开文件,它的用法为:

    FILE *fopen(char *filename, char *mode);

    filename为文件名(包括文件路径),mode为打开方式,它们都是字符串。

    fopen() 函数的返回值

    fopen() 会获取文件信息,包括文件名、文件状态、当前读写位置等,并将这些信息保存到一个 FILE 类型的结构体变量中,然后将该变量的地址返回。

    FILE 是 <stdio.h> 头文件中的一个结构体,它专门用来保存文件信息。我们不用关心 FILE 的具体结构,只需要知道它的用法就行。

    如果希望接收 fopen() 的返回值,就需要定义一个 FILE 类型的指针。例如:

    FILE *fp = fopen("demo.txt", "r");

    表示以“只读”方式打开当前目录下的 demo.txt 文件,并使 fp 指向该文件,这样就可以通过 fp 来操作 demo.txt 了。fp 通常被称为文件指针。

    判断文件是否打开成功

    打开文件出错时,fopen() 将返回一个空指针,也就是 NULL,我们可以利用这一点来判断文件是否打开成功,请看下面的代码:

        FILE *fp;
        if( (fp=fopen("D:\demo.txt","rb") == NULL ){
            printf("Fail to open file!
    ");
            exit(0);  //退出程序(结束程序)
        }

    fopen() 函数的打开方式

    不同的操作需要不同的文件权限。例如,只想读取文件中的数据的话,“只读”权限就够了;既想读取又想写入数据的话,“读写”权限就是必须的了。

    另外,文件也有不同的类型,按照数据的存储方式可以分为二进制文件和文本文件,它们的操作细节是不同的。

    在调用 fopen() 函数时,这些信息都必须提供,称为“文件打开方式”。最基本的文件打开方式有以下几种:

    控制读写权限的字符串(必须指明)
    打开方式 说明
    "r" 以“只读”方式打开文件。只允许读取,不允许写入。文件必须存在,否则打开失败。
    "w" 以“写入”方式打开文件。如果文件不存在,那么创建一个新文件;如果文件存在,那么清空文件内容(相当于删除原文件,再创建一个新文件)。
    "a" 以“追加”方式打开文件。如果文件不存在,那么创建一个新文件;如果文件存在,那么将写入的数据追加到文件的末尾(文件原有的内容保留)。
    "r+" 以“读写”方式打开文件。既可以读取也可以写入,也就是随意更新文件。文件必须存在,否则打开失败。
    "w+" 以“写入/更新”方式打开文件,相当于wr+叠加的效果。既可以读取也可以写入,也就是随意更新文件。如果文件不存在,那么创建一个新文件;如果文件存在,那么清空文件内容(相当于删除原文件,再创建一个新文件)。
    "a+" 以“追加/更新”方式打开文件,相当于a和r+叠加的效果。既可以读取也可以写入,也就是随意更新文件。如果文件不存在,那么创建一个新文件;如果文件存在,那么将写入的数据追加到文件的末尾(文件原有的内容保留)。
    控制读写方式的字符串(可以不写)
    打开方式 说明
    "t" 文本文件。如果不写,默认为"t"
    "b" 二进制文件。


    调用 fopen() 函数时必须指明读写权限,但是可以不指明读写方式(此时默认为"t")。

    关闭文件

    文件一旦使用完毕,应该用 fclose() 函数把文件关闭,以释放相关资源,避免数据丢失。fclose() 的用法为:

    int fclose(FILE *fp);

    fp 为文件指针。例如:

    fclose(fp);

    文件正常关闭时,fclose() 的返回值为0,如果返回非零值则表示有错误发生。

    C语言 fread()与fwrite()函数说明与示例

    1.作用

      读写文件数据块。

    2.函数原型

      (1)size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );

         其中,ptr:指向保存结果的指针;size:每个数据类型的大小;count:数据的个数;stream:文件指针

         函数返回读取数据的个数。

      (2)size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );

           其中,ptr:指向保存数据的指针;size:每个数据类型的大小;count:数据的个数;stream:文件指针

         函数返回写入数据的个数。

    3.注意

      (1)写操作fwrite()后必须关闭流fclose()。

      (2)不关闭流的情况下,每次读或写数据后,文件指针都会指向下一个待写或者读数据位置的指针。

    4.读写常用类型

      (1)写int数据到文件

    #include <stdio.h>
    #include <stdlib.h>
    int main ()
    {
      FILE * pFile;
      int buffer[] = {1, 2, 3, 4};
      if((pFile = fopen ("myfile.txt", "wb"))==NULL)
      {
          printf("cant open the file");
          exit(0);
      }
      //可以写多个连续的数据(这里一次写4个)
      fwrite (buffer , sizeof(int), 4, pFile);
      fclose (pFile);
      return 0;
    }
    View Code

    (2)读取int数据

    #include <stdio.h>
    #include <stdlib.h>
    
    int main () {
        FILE * fp;
        int buffer[4];
        if((fp=fopen("myfile.txt","rb"))==NULL)
        {
          printf("cant open the file");
          exit(0);
        }
        if(fread(buffer,sizeof(int),4,fp)!=4)   //可以一次读取
        {
            printf("file read error
    ");
            exit(0);
        }
    
        for(int i=0;i<4;i++)
            printf("%d
    ",buffer[i]);
        return 0;
    }
    View Code

    (1)写结构体数据到文件

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    typedef struct{
        int age;
        char name[30];
    }people;
    
    int main ()
    {
        FILE * pFile;
        int i;
        people per[3];
        per[0].age=20;strcpy(per[0].name,"li");
        per[1].age=18;strcpy(per[1].name,"wang");
        per[2].age=21;strcpy(per[2].name,"zhang");
    
        if((pFile = fopen ("myfile.txt", "wb"))==NULL)
        {
            printf("cant open the file");
            exit(0);
        }
    
        for(i=0;i<3;i++)
        {
            if(fwrite(&per[i],sizeof(people),1,pFile)!=1)
                printf("file write error
    ");
        }
        fclose (pFile);
        return 0;
    }
    View Code

    (2)读结构体数据

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    typedef struct{
        int age;
        char name[30];
    }people;
    
    int main () {
        FILE * fp;
        people per;
        if((fp=fopen("myfile.txt","rb"))==NULL)
        {
          printf("cant open the file");
          exit(0);
        }
    
        while(fread(&per,sizeof(people),1,fp)==1)   //如果读到数据,就显示;否则退出
        {
            printf("%d %s
    ",per.age,per.name);
        }
        return 0;
    }
    View Code

    以上fwrite写进文件里面的是指针,如果要写进整数或其它类型的数据,用fprintf方便一点

    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
        FILE *fp;                                     /* 定义文件指针*/
    
        if( ( fp = fopen("f1.txt", "w") ) == NULL){    /* 打开文件 */
               printf("File open error!
    ");
               exit(0);
        }
        fprintf( fp, "%s", "Hello World! " );            /* 写文件 */    
    
            if( fclose( fp ) ){                         /* 关闭文件 */
            printf( "Can not close the file!
    " );
            exit(0);
        }
    
        return 0;
    }

    fseek


      功 能: 重定位流上的文件指针


      用 法: int fseek( FILE *stream, long offset, int origin );
      第一个参数stream为文件指针
      第二个参数offset为偏移量,整数表示正向偏移,负数表示负向偏移
      第三个参数origin设定从文件的哪里开始偏移,可能取值为:SEEK_CUR、 SEEK_END 或 SEEK_SET

    其中SEEK_SET,SEEK_CUR和SEEK_END和依次为0,1和2.
      简言之:
      fseek(fp,100L,0);把fp指针移动到离文件开头100字节处;
      fseek(fp,100L,1);把fp指针移动到离文件当前位置100字节处;
      fseek(fp,-100L,2);把fp指针退回到离文件结尾100字节处。


      描 述: 函数设置文件指针stream的位置。如果执行成功,stream将指向以fromwhere为基准,偏移offset个字     节的位置。如果执行失败(比如offset超过文件自身大小),则不改变stream指向的位置。
      返回值: 成功,返回0,否则返回其他值。

      #include <stdio.h>
      #define N 5
      typedef struct student {
       long sno;
       char name[10];
       float score[3];
      } STU;
      void fun(char *filename, STU n)
      {
       FILE *fp;
       fp = fopen(filename, "rb+");
       fseek(fp, -1L*sizeof(STU),SEEK_END);
      fwrite(&n, sizeof(STU), 1, fp);
      fclose(fp);
      }
      void main()
      {
        STU t[N]={ {10001,"MaChao", 91, 92, 77}, {10002,"CaoKai", 75, 60, 88},
        {10003,"LiSi", 85, 70, 78}, {10004,"FangFang", 90, 82, 87},
        {10005,"ZhangSan", 95, 80, 88}};
        STU n={10006,"ZhaoSi", 55, 70, 68}, ss[N];
        int i,j; FILE *fp;
        fp = fopen("student.dat", "wb");
        fwrite(t, sizeof(STU), N, fp);
        fclose(fp);
        fp = fopen("student.dat", "rb");
        fread(ss, sizeof(STU), N, fp);
        fclose(fp);
        printf("
    The original data :
    
    ");
        for (j=0; j<N; j++)
        {
         printf("
    No: %ld Name: %-8s Scores: ",ss[j].sno, ss[j].name);
         for (i=0; i<3; i++) 
    View Code
  • 相关阅读:
    kali payload程序制作
    密码在线破解
    Metasploit安装db_autopwn.rb模块
    Metasploit使用教程(一)
    CentOS7安装openvas
    Ansible系列基础篇 1.7.2、PlayBook之变量
    Ansible系列基础篇 1.7.2、PlayBook之循环
    Ansible系列基础篇 1.7.2、PlayBook之if
    Ansible系列基础篇 1.7.2、PlayBook之include
    Ansible系列基础篇 1.7.2、PlayBook之block
  • 原文地址:https://www.cnblogs.com/-citywall123/p/10592012.html
Copyright © 2011-2022 走看看