美文网首页
8.文件操作

8.文件操作

作者: 一漫116 | 来源:发表于2017-08-06 14:15 被阅读5次

    // 命令行参数

    // 命令行参数用于向程序传递在执行阶段才确定的数据

    // 提升软件的可移植行

    int main(int argc, char *argv[])

    {

    //argc命令行参数的个数

    //argv[][]字符串数组,每一行保存一个命令行参数

    //argv[0]

    //argv[1]

    //...

    //argv[argc-1]

    int i = 0;

    //[0,argc)

    for(i = 0; i < argc; i++)

    {

    printf("argv[%d] : %s\n", i, argv[i]);

    }

    一、文件:存储在外部介质上数据的集合,是操作系统数据管理的单位。c语言把文件看做是一个字符的序列。就是说文件是由字符组成的一个个字符流。因此c语言也将文件称作流。

    二、c语言支持2种类型的文件:

    1.二进制文件

    以补码的形式存储。显示的时候是以文本的方式打开的话会看不懂,因为文本是一个字节一个字节的显示

    2.文本文件

    以ASCii码格式存放,把每个数据当做一个字符,即把字符相应的ASCII码化成二进制存储,所以一个字符占一个字节,显示的时候按字符显示,故以文本的方式打开就能看得懂

    三、文件的分类:

    从用户的角度看:

    特殊文件:标准输入输出文件(stdin(键盘),stdout(显示屏)),标准错误(stderr(显示屏))

    普通文件:磁盘文件

    从操作系统角度来看:每一个与主机相连的输入输出设备都看做是一个文件

    例如:输入文件:键盘,  输出文件:显示屏,打印机

    四、文件操作:

    针对指定目录下的文件进行简单的读写操作

    五、补充:文件的应用

    1.静态数据储存,

    六、文件类型结构体:FILE

    文件西in西用系统定义的名为FILE的结构体描述,该结构体定义在stdio.h文件中。我们可以直接用

    用法:成功打开文件的时候,系统会自动建立文件结构体,该结构体包含描述该文件的所有的信息,然后返回出一个指针,该指针就指向该结构体,为了便于理解,可以把该指针看做是指向该文件的指针,程序可以通过该指针访问这个文件。在文件关闭后,该文件结构体就会被释放。

    打开一个文件:

    功能:以指定的模式打开指定路径下的文件,返回⼀个关联该文件的文件指针作为唯一识别标志。

    参数:

    path:用于指定文件路径;比如/home/user/Desktop/hello.c

    mode:用于指定文件的操作模式,常用的模式有r,r+,w,w+,a,a+

    函数:  FILE *fopen(char *filename,char *mode);

    返回值:正常打开,返回指向文件(文件结构体)的指针

                  失败, 返回NULL

    打开方式:

                    r:以只读的方式打开一个文本文件

                    rb:以只读的方式打开一个二进制文件

                    w:以只写的方式打开一个文本文件

                    wb:以只写的方式打开一个二进制文件

                    a:以追加的方式打开一个文本文件

                    ab:以追加的方式打开一个二进制文件

                    r+:以读写的方式打开一个文本文件

                    rb+:...................................二进制文件

                    w+;以读写的方式打开文本文件

                    wb+:以读写的方式打开一个二进制文件

                    a+:以读写的方式打开一个文本文件

                    ab+:.....................................二进制文件

    关闭一个文件:

    函数:  int fclose(FILE *fp) 

    功能:关闭fp指向的文件,释放文件结构体和文件指针

    返回值:  成功,返回0

    失败,非0

    例:

    #include

    #include

    void main()

    {

    int a;

    FILE *fp;

    fp=fopen("2.c","a");

    if(fp==NULL)

    {

    printf("open is failed!\n");

    exit(0);

    }

    a=fclose(fp);

    if(a==0)

    printf("clost is success!\n");

    else

    printf("close is failed!\n");

    fp=NULL;//防止成为野指针

    }

    /*

    1.若文件在当前路径下:

    fp=fopen("文件名","r");

    2.若文件不在当前目录下:

    fp=fopen("文件的绝对路径","r");

    3.若要手动输入打开的文件名

    char filename[30];

    scanf("%s",filename);

    fp=fopen(filename,"r");

    4.要对一个文件进行操作,必须先打开这个文件,操作完成之后,必须关闭这个文件,不关闭的话容易造成数据丢失,关闭之后使fp=NULL.

    5.以r,r+的方式打开文件,若文件不存在,打开失败

    w,w+,a,a+的方式发开文件,若文件不存在,则会自动创建同名文件6.以w/w+的方式打开文件会覆盖掉文件中之前的内容。

    7.以a/a+的方式打开文件不会覆盖之前的内容,会接着之前内容继续写

    */

    函数: char fputc(char ch,FILE *fp);

    功能:把一个字符ch写到fp指向的文件中

    返回值:正确,返回ch,

            错误,返回EOF

            EOF通常看做是一个特殊的字符理解,其实是头文件stdio.h中常量-1的宏定义。在linux中,它并不是一个特殊字符,它只是当系统读到文件结尾或者出错的时候所返回的一个信号值。

      #include

    void main()

    {

    char ch='a';

    fputc(ch,stdout); //<=>putchar(ch);

    fputc('\n',stdout);

    }

    函数:char fgetc(FILE *fp);

    功能:从fp指向的文件中读取一个字符

    返回值:正常,返回读取到的字符;当读到文件尾或者出错的时候,返回EOF.

    #include

    void main()

    {

    char ch;

    ch=fgetc(stdin);

    fputc(ch,stdout);

    putchar('\n');

    }

    练习:将一个文件的内容读到另一个文件中去

    #include

    #include

    void main()

    {

    char c,d;

    FILE *fp1,*fp2;

    fp1=fopen("2.c","r");

    if(fp1==NULL)

    {

    printf("fopen 2.c failed!\n");

    exit(0);

    }

    fp2=fopen("xxx.c","w");

    if(fp2==NULL)

    {

    printf("fopen xxx.c is failed!\n");

    exit(0);

    }

    while((c=fgetc(fp1))!=EOF)

    {

    d=fputc(c,fp2);

    putchar(d);

    }

    fclose(fp1);

    fclose(fp2);

    fp1=NULL;

    fp2=NULL;

    }

    函数:long ftell(FILE *fp);

    功能:得知目前的文件读写指针的位置

    返回值:正确,返回目前文件读写指针的位置,当前文件指针所在的位置距离文件开头的长度。

                    错误,返回-1.

    #include

    #include

    void main()

    {

    FILE *fp;

    long position;

    if((fp=fopen("2.c","a"))==NULL)

    {

    printf("open failed!\n");

    exit(0);

    }

    position=ftell(fp);

    printf("%ld\n",position);

    fclose(fp);

    fp=NULL;

    }

    函数:int fscanf(FILE *fp,char *format,arg_list)

    功能:从文件fp中获取输入,以一定的格式赋给后面的变量

                fscanf(fp,"%s",name);

    返回值:成功,返回输入的个数,出错或者到达文件的结尾,返回EOF

    例:

    #include

    void main()

    {

    char name[20];

    int age;

    //scanf("%s%d",name,&age);

    <=>

    fscanf(stdin,"%s%d",name,&age);//fscanf(fp,"%s%d",name,&age);

    printf("name=%s,age=%d\n",name,age);

    }

    函数:int fprintf(FILE *fp,char *format,arg_list);

    功能:把变量的值按一定的格式输出到fp指向的文件中去

                fprintf(fp,"%s",name);

    返回值:成功,返回输入的个数,出错或者到达文件尾,返回EOF

    例:

    #include

    void main()

    {

    char name[20];

    int age;

    fscanf(stdin,"%s%d",name,&age);

    // printf("%s %d\n",name,age);

    <=>

    fprintf(stdout,"%s %d\n",name,age);

    }

    练习:从键盘按格式输入数据存到磁盘文件中去,并回显到屏幕上。

    #include

    #include

    void main()

    {

    char name[20];

    int age;

    FILE *fp;

    if((fp=fopen("xxx.c","w+"))==NULL)

    {

    printf("打开失败!\n");

    exit(0);

    }

    fscanf(stdin,"%s %d",name,&age);

    fprintf(fp,"%s %d",name,age);

    fscanf(fp,"%s %d",name,&age);

    fprintf(stdout,"%s %d\n",name,age);

    }

    函数:void rewind(FILE *fp)

    功能:重置文件指针fp,使它指向文件的开头

    #include

    #include

    void main()

    {

    FILE *fp;

    if((fp=fopen("2.c","a"))==NULL)

    {

    printf("faile!\n");

    exit(0);

    }

    long position=ftell(fp);

    printf("%ld\n",position);

    rewind(fp);//使文件指针fp指到文件的最开头。

    position=ftell(fp);

    printf("%ld\n",position);

    fclose(fp);

    }

    函数:int fseek(FILE *fp,long offset,int whence)

    功能:  使fp所指向的文件的读写指针位置重置到指定的位置,从whence位置移动offset个字符

    返回值:成功0,  失败-1.

    whence的值:

    0:文件开头

    1:当前指针所指的位置

    2:文件尾

    例:

    fseek(fp,100L,0):将文件指针移到离文件头100个字节的位置

    fseek(fp,50L,1):将位置指针从当前位置向后偏移50字符的长度

    fseek(fp,-10L,2):将位置指针从文件尾倒移10个字节

    #include

    #include

    void main()

    {

    FILE *fp;

    long position;

    if((fp=fopen("2.c","a"))==NULL)

    {

    printf("faile!\n");

    exit(0);

    }

    position=ftell(fp);

    printf("%ld\n",position);

    fseek(fp,100L,1);

    position=ftell(fp);

    printf("%ld\n",position);

    fseek(fp,100L,0);

    position=ftell(fp);

    printf("%ld\n",position);

    }

    函数:int fread(void *buffer,int num_bytes,int count,FILE *fp);

    功能:从fp指向的文件中一次读取count个num_bytes字节大小的数据块到buffer中。

    例:fread(&age,sizeof(int),1,fp);

    返回值:成功,返回count;失败或者文件结束,返回0.

    函数:int fwrite(void *buffer,int num_byte,int count,FILE *fp);

    功能:从buffer中一次读取count个num_bytes字节大小的数据块到fp指向的文件中去

    例:fwrite(&age,sizeof(int),1,fp);

    返回值:成功,返回count;失败或者文件结束,返回0.

    例:

    #include

    #include

    void main()

    {

    FILE *fp;

    int b,a=100;

    if((fp=fopen("3.c","w+"))==NULL)

    {

    printf("open is failed!\n");

    exit(0);

    }

    if(fwrite(&a,sizeof(int),1,fp)!=1)

    {

    printf("fwrite is failed!\n");

    exit(0);

    }

    rewind(fp); //让指针重置到文件的开头

    //用fread从文件3.c中读出数据赋给b

    if(fread(&b,sizeof(int),1,fp)!=1)

    {

    printf("fread is failed!\n");

    exit(0);

    }

    printf("b=%d\n",b);

    fclose(fp);

    fp=NULL;

    }

    练习:从键盘输入4个学生的个人信息,然后转存到磁盘中去,又读出来。

    #include

    #include

    void main()

    {

    int i;

    FILE *fp;

    struct student

    {

    char name[20];

    int age;

    };

    struct student stu1[4],stu2[4];

    for(i=0;i<4;i++)

    scanf("%s %d",stu1[i].name,&stu1[i].age);

    if((fp=fopen("xxx.c","w+"))==NULL)

    {

    printf("open is failed!\n");

    exit(0);

    }

    for(i=0;i<4;i++)

    {

    if(fwrite(&stu1[i],sizeof(struct student),1,fp)!=1)

    {

    printf("写错了!\n");

    }

    }

    rewind(fp);//把文件的指针重置到文件开头

    for(i=0;i<4;i++)

    {

    if(fread(&stu2[i],sizeof(struct student),1,fp)!=1)

    {

    printf("读错了!\n");

    }

    }

    for(i=0;i<4;i++)

    {

    printf("%s %d\n",stu2[i].name,stu2[i].age);

    }

    fclose(fp);

    fp=NULL;

    }

                 

    相关文章

      网友评论

          本文标题:8.文件操作

          本文链接:https://www.haomeiwen.com/subject/mcnglxtx.html