• 【C_Language】---C文件学习


    ---恢复内容开始---

      又看了一遍文件的知识点了,断断续续已经看了2-3遍,也就这次花了点时间做了一下总结,以后我想都不会再去翻书了,哈哈。

    1、 基于缓冲区的文件操作
    2、 打开关闭文件
    3、 单个字符读写
    4、 文件指针定位
    5、 字符串读写
    6、 块读块写
    7、 格式化读写
    一、 读写操作都要经过一个缓冲区, 满足一定条件后再进行读入
    和写入。
    标准的输入以及输出, 内部为基于缓冲区的文件操作。
    标准输入: stdin
    标准输出: stdout
    标准错误: stderr
    清理缓冲区: fflush();

    二、 打开关闭文件
    c语言当中, 用FILE这个结构体, 描述打开的文件的详细信息。 FILE定义stdio.h文件里面。
    1、 打开函数
    原型: FILE *fopen(const char *path, const char *mode); //第一个参数为路径 第二个为打开的方式
    绝对路径 or 相对路径:相对于顶层目录的路径 当前工程下的路径
    工程下面有一个1.txt: "d://_ccccccc/1.txt"--结对路径 "1.txt" --相对路径
    参数2:打开方式--读,写
    返回值: 打开成功后返回操作这个文件的指针。 失败返回NULL

    程序代码如下:

     1 FILE *fp_open(void)
     2 {
     3   static FILE *fp;
     4   fp = fopen(FILE_NAME,"w+"); //打开或创建一个txt文件。 
     5   if(fp != NULL)
     6     printf("File opened succed!");    
     7   else
     8     printf("File opened failed!");
     9   return fp;
    10 }
    11 int main(void) 
    12 {
    13   FILE *fp = fp_open(); //定义一个文件指针,指向一个采用“w+”方式打开的文件 
    14   return 0;
    15 }

    在此有必要掌握mode方式表:详情见图

    打开方式

    含义

    “r/rb”    (只读)

    为输入打开一个文本/二进制文件

    “w/wb” (只写)

    为输出打开或建立一个文本二进制文件

    “a/ab”    (追加)

    向文本/二进制文件尾追加数据

    “r+/rb+” (读写)

    为读/写打开一个文本/二进制文件

    “w+/wb+” (读写)

    为读/写建立一个文本/二进制文件

    “a+/ab+” (读写)

    为读/写打开或建立一个文本/二进制文件

    注意:

           用”r”方式打开的文件只能进行读操作,而且该文件必须存在,不能用”r”打开一个不存在的文件

           用”w”打开的文件只能进行写操作,如果原来不存在,则打开时新创建一个该文件名字的文件,如果打开原来存在的文件,则从该文件的起始位置重新继续写入,原来的内容会被覆盖掉。

           用”a”打开的文件也只能进行写操作,且文件必须存在,此时文件指针移动到文件的末尾,从末尾继续添加新的数据。

           “b“表示打开的是一个二进制文件,r+或w+表示可以进行读写操作。

    2、 关闭函数
    fclose(FILE *fp);//关闭fp指向的文件

    三、 单个字符读写
    写: fputc 原型: int fputc(int c, FILE *stream); //正确返回ch,错误返回EOF(-1)
    读: fgetc 原型: int fgetc(FILE *stream); //正确返回读到的ch,错误返回EOF(-1)
    测试函数如下:

     1 int main(void) 
     2 {
     3     char ch;
     4     FILE *fp = fp_open(); //fp_open()函数见上面 
     5     ch = getchar(); //从控制台输入一个字符 
     6     fputc(ch,fp); //将字符写入文件 
     7     rewind(fp); //将文件指针重置在文件头部 
     8     printf("%c",fgetc(fp)) ; //打印出读到的字符 
     9     return 0;
    10 }


    注意:
    putc(ch,fp)与fputc(ch,fp)效果一致,但是putc可以作为宏定义,速度更快
    getc(fp)与fgetc(fp)效果一致,但是getc可以作为宏替换,速度更快。
    putchar(c) 则是fputc(c,stdout);
    getchar()则是fgetc(stdin);

    在此在介绍一下getc和getchar()以及putc和putchar()这两个函数的区别以及联系
    输入原型: getc: int __cdecl getc(FILE *_File); 向某个文件输入一个字符
    getchar: int __cdecl getchar(void); 这个是getc的一个变形,,指定文件的形参为stdin;
    输出原型: putc : int __cdecl putc(int _Ch,FILE *_File); 从某个某个文件输出
    putchar: int __cdecl putchar(int _Ch);

    四、 文件指针定位
    1、 rewind(FILE *fp); //将读写指针定位到文件开始位置。
    rewind函数具体应用参考上面函数,
    2、 fseek(FILE *fp,long offset,int whence);//将fp指向的文件的读写 //参数2:表示便宜字节数 参数3:表示参考位置
    /*标准库下,含有这三个宏定义:SEEK_SET:起始位置 SEEK_END:末尾 SEEK_CUR:当前位置*/
    rewind()其实是fsee()的一个特殊函数
    rewind(fp) = fseek(fp,0,SEEK_SET); 这两者是相等的。
    3.int feof(FILE *fp); //判断文件读写指针是否到达末尾, 到达返回1, 没有返回0
    同理,该函数因该是也和fseek()有异曲同工之妙。
    五、 字符串读写
    写: fputs
    原型: int fputs(const char *s,FILE *stream); //返回值,返回输入字符串的最后的‘’,如果输入过程被打断,则会返回最后一次输入的字符

    读: fgets
    原型: char *fgets(char *s, int n, FILE *stream); //返回值,成功返回接收字符串的首地址,失败的话,返回NULL
    程序如下:

     1 int main(void) 
     2 {
     3     char s[100];
     4     FILE *fp = fp_open(); //定义一个文件指针,指向一个采用“w+”方式打开的文件 
     5     gets(s); //输入一个字符串
     6     fputs(s,fp);    //将字符串的内容输入到我文件中
     7     rewind(fp); 
     8     printf("%s
    ",fgets(s,5,fp)); //从文件中读取五个字节的字符串(包括最后的‘’,所以实际只能取出4个)
     9     return 0;
    10 }


    这里需要的注意的是,读取数来的是一个n个字节的字符串,包含最后'',所以在测试的时候,只能输出4个字符,最后一个字节是''。
    六、 块读块写
    写: fwrite
    原型:size_t fread(void *buffer,size_t size, size_t count, FILE *fp);
    读: fread
    原型:size_t fwrite(void *buffer,size_t size, size_t count, FILE *fp);
    功能:
    fread:从fp所指向的文件中读取count个块,每个块的长度为size个字节,存放到以buffer为首地址的内存中(buffer必须是已经开辟空间的)、
    fwrite:从以buffer为首地址的内存中读取count个快,每个 快的的长度为size个字节,写入到fp所指向的文件中。
    返回值:1 成功 0 出错或者文件尾部

    七、 格式化读写
    fscanf 原型:int fscanf(FILE *fp,const char *format[,address,?])
    fprintf 原型:int fprintf(FILE *fp,const char *format[,argument,?])
    其实这俩函数可以类比printf()将数据打印到控制台上和scanf()从控制台输入数据。
    fscanf()函数就是?????????????????
    fprintf()函数就是将数据以某种格式输入到文件中。 //有个问题 ,输入十进制int型数字,为何按照字符串输出会能够输出???
    八、其他一些函数的说明
    1、 ftell()函数
    原型:long ftell(FILE *fp)
    功能:返回位置指针当前位置(用相对文件开头的位移量表示)
    返回值:成功,返回当前位置指针位置,失败返回-1L;
    2、ferror()函数
    原型:int ferror(FILE *fp)
    功能:测试文件是否出现错误
    返回值:未出错, 0;出错,非 0
    说明:每次调用文件输入输出函数,均产生一个新的 ferror 函数值,所以应及时测试fopen 打开文件时, ferror 函数初值自动置为 0
    3. remove() 函数
    函数原型: int remove(char* path)
    功能:删除指定路径的文件
    返回值:成功删除, 0;否则, -1
    4. clearerr() 函数
    函数原型: void clearerr(FILE *fp)
    功能:使文件错误标志置为 0
    返回值:无
    说明:出错后,错误标志一直保留,直到对同一文件调 clearerr(fp)或 rewind 或任何其它一个输入输出函数

    5.文件操作步骤
    1. 打开文件
    FILE* fp = fopen("路径:文件名", "打开方式"); //r/w/rb/wb/a/r+/w+ 文本文件和二进制文件
    2. 文件读写
    1>. 读写单个字符: fputc() fgetc()
    2>. 读写字符串: fputs() fgets()
    3>. 读写结构体等(读写块) fwrite() fread() //二进制
    4>. 格式化读写 fprintf() fscanf()
    3. 关闭文件
    fclose(fp);

    //文件函数总结
    1、 fputc、 fgetc、 feof、 rewind
    2、 rewind、 fseek
    3、 fputs、 fgets
    4、 fread、 fwrite
    5、 fscanf、 fprintf
    6、 int ftell(FILE *fp)// fseek(fp,0,SEEK_END),ftell(fp);//

     

    ---恢复内容结束---

  • 相关阅读:
    HTTP 501 错误 – 未实现 (Not implemented) 或者是 Failure: Address already in use
    HTTP 400 Bad request 原因
    树莓派 NAS aria2 下载磁力链接无速度
    踩坑备忘之“yarn : 无法加载文件 C:\Users\siazon\AppData\Roaming\npm\yarn.ps1,因为在此系统上禁止运行脚本。"
    架构小试之IDL
    服务端基本概念和指标
    git常用命令
    mysql20211116
    blog JavaJinguo
    android 分享功能
  • 原文地址:https://www.cnblogs.com/szhb-5251/p/5700814.html
Copyright © 2020-2023  润新知