• C(8)


    C语言位运算与文件

    本章引言:

    在不知不觉中我们的C高速入门系列已经慢慢地接近尾声了,而在这一节中,我们会对

    C语言中的位运算和文件进行解析,相信这两章对于一些人来说是陌生的,由于非常多

    老师都会跳过这两个大知识点,事实上这两个也是灰常重要的!比方一个问题,叫你算

    变量a乘以2,怎么写效率高?直接a *2,非常多人都这样写,可是假设你会位运算的话,你会a<<1;

    位运算的效率但是比a*2高的哦!

    还有一个问题,不用变量左中间值,直接交换两个变量的值?

    你怎么做?也是用到位运算!文件操作重要性就不用说啦!好了,请读者尾随笔者的脚步

    对C语言中的位运算与文件读写的核心知识点进行剖析吧~



    本节学习路线图:





    位运算:




    ps:位运算符并不改变变量自身的值,能够在运算符后加上等号:  a &= b  

    等同于a = a&b !




    文件:



    文本文件的使用方式:

    "r" 仅仅读方式打开一个文本文件,仅仅同意度数据,不存在则打开失败
    "w" 仅仅写方式打开或建立一个文本文件,仅仅同意写数据
    "a" 追加的方式打开一个文本文件,可在文件尾写数据,不存在则创建一个
    "r+" 读写方式打开一个文本文件,同意读写,不存在,打开失败
    "w+" 读写方式打开或建立一个文本文件,同意读写
    "a+" 读写方式打开文本文件,在文件末尾追加数据,不存在则创建一个

    ps:对于二进制文件,相应的仅仅要改成在每一个后面加上一个b就能够了:

    如: r --> rb      r+ = rb+


    文件具体学习图:





    使用代码演示样例:


    ①单个字符写入/读取

    写入: fputc()


    1. <span style="font-family:Microsoft YaHei;">#include <stdio.h>  
    2. #include <string.h>  
    3. int main()  
    4. {  
    5.     FILE *fp;  
    6.     char str[] = "Write The Data to File!";  
    7.     int index = 0;  
    8.     fp = fopen("test1.txt","w");  
    9.     if(fp == NULL)  
    10.     {  
    11.         printf("文件打开失败! ");  
    12.         exit(1);  
    13.     }  
    14.     //由于是一个个字符输入的,所以要获得长度   
    15.     while(index < strlen(str))  
    16.       fputc(str[index++],fp);  
    17.     fclose(fp);   
    18.     return 0;  
    19. } </span>  


    读取:fgetc()


    1. <span style="font-family:Microsoft YaHei;">#include "stdio.h"  
    2. int main()  
    3. {  
    4.     FILE *fp;  
    5.     char c;  
    6.     int n = 1;  
    7.     if((fp = fopen("test1.txt","r")) == NULL)  
    8.     {  
    9.         printf("文件打开失败! ");  
    10.         exit(1);   
    11.     }  
    12.     //EOF是文件结尾的标志,此处是推断是否到文件尾     
    13.     while((c = fgetc(fp)) != EOF)  
    14.     {  
    15.         printf("%c",c);  
    16.         n++;  
    17.     }  
    18.     printf(" ");  
    19.     fclose(fp);  
    20.     return 0;  
    21. } </span>  


    执行截图:




    ps:假设不写完整路径的话,比方:d:\c_code\day 8的话,会在代码所在的文件夹下生成相应的文本文件!




    ②读写一个字符串:

    写入fputs()


    1. <span style="font-family:Microsoft YaHei;">/* 
    2.     fputs(字符串,fp) 
    3.     作用:向fp所指的文件里,将字符串写入,''并不写入!  
    4. */  
    5.   
    6. #include <stdio.h>  
    7. int main()  
    8. {  
    9.     char str[] = "通过fputs方法往文件里写入信息!";  
    10.     FILE *fp = fopen("test2.txt","w");  
    11.     if(fp == NULL)  
    12.     {  
    13.         printf("文件打开失败! ");  
    14.         exit(1);  
    15.           
    16.     }  
    17.     fputs(str,fp);  
    18.     fclose(fp);  
    19.     return 0;  
    20. }</span>  


    读取:fgets()


    1. <span style="font-family:Microsoft YaHei;">/* 
    2.      fgets(字符串数组,n,文件指针) 
    3.      就是:从fp执指向的文件里读取一个长度为n - 1的字符串, 
    4.      存储在一维字符数组中 ,由于字符串会默认加入一个''  
    5. */  
    6.   
    7.   
    8. #include <stdio.h>  
    9. int main()  
    10. {  
    11.     FILE *fp;  
    12.     char str[20];  
    13.     if((fp = fopen("test2.txt","r")) == NULL)  
    14.     {  
    15.         printf("文件打开失败! ");  
    16.         exit(1);  
    17.     }  
    18.     //这里写3是由于,汉字是占2个字节的   
    19.     while(fgets(str,3,fp) != NULL)  
    20.     printf("%s",str);  
    21.     printf(" ");  
    22.     fclose(fp);  
    23.     return 0;  
    24. }</span>  


    执行截图:




    ③格式化读写函数


    这个和之前学的scanf()和printf()用法一样,可是,前者是针对内存中的数据的;

    而fscanf(0和fprintf()则相应文件读写的!


    ps:要注意哦!fprintf是将控制台的内容打印到文件里哦!所以是写入

    fscanf()是将文件里的内容输入到控制台哦! 所以是读取


    写入fprint:


    1. <span style="font-family:Microsoft YaHei;">#include <stdio.h>  
    2. int main()  
    3. {  
    4.     char c[] = "Today is 2014 July ";  
    5.     int day = 22;  
    6.     char a = 't',b = 'h';  
    7.     FILE *fp;  
    8.     if((fp = fopen("test3.txt","w"))== NULL)  
    9.     {  
    10.         printf("文件打开失败! ");  
    11.         exit(1);      
    12.     }  
    13.     fprintf(fp,"%s%d %c%c",c,day,a,b);  
    14.     fclose(fp);  
    15.     return 0;  
    16. }</span>  



    读取fscanf()


    1. <span style="font-family:Microsoft YaHei;">#include <stdio.h>  
    2. int main()  
    3. {  
    4.     //这里非常easy出问题,所以我并不喜欢用fscanf这个函数   
    5.     char c1[5],c2[5],c3[5],c4[5],c5[5],c6[5];  
    6.     int day,year;  
    7.     FILE *fp;  
    8.     if((fp = fopen("test3.txt","r"))== NULL)  
    9.     {  
    10.         printf("文件打开失败! ");  
    11.         exit(1);      
    12.     }  
    13.     //这个要依照读取的文件的格式写,我弄了N久还是不行  
    14.     //就直接用6个字符串了...   
    15.     fscanf(fp,"%s%s%s%s%s%s",&c1,&c2,&c3,&c4,&c5,&c6);  
    16.     printf("%s %s %s %s %s %s ",c1,c2,c3,c4,c5,c6);  
    17.     fclose(fp);  
    18.     return 0;  
    19. }</span>  


    执行截图:






    二进制文件的读写


    演示样例代码:将学生信息存储到结构体中,然后通过fwrite()函数将结构体内容写入文件里;

    在通过fread()函数读取出来



    ①数据块方式写入:

    演示样例代码:

    1. <span style="font-family:Microsoft YaHei;">#include <stdio.h>  
    2.   
    3. typedef struct  
    4. {  
    5.     int id;  
    6.     char name[20];  
    7.     int age;  
    8. }STU;  
    9.   
    10. int main()  
    11. {  
    12.     STU stu;  
    13.     FILE *fp;  
    14.     char c;  
    15.     //内容是追加的!   
    16.     if((fp = fopen("test4.data","ab"))== NULL)  
    17.     {  
    18.         printf("文件打开失败! ");  
    19.         exit(1);      
    20.     }  
    21.     //录入多个学生的信息:  
    22.     while(1)  
    23.     {  
    24.         printf("请输入学号: ");scanf("%d",&stu.id);  
    25.         printf(" 请输入姓名: ");scanf("%s",&stu.name);  
    26.         printf(" 请输入年龄: ");scanf("%d",&stu.age);  
    27.         //參数依次是: 数据起始地址,每次写入的数据块的字节数,数据块的数目,文件指针   
    28.         fwrite(&stu,sizeof(stu),1,fp);  
    29.         printf(" 继续输入?(Y/N) ");  
    30.         getchar();  
    31.         c = getchar();  
    32.         if(c == 'y' || c == 'Y')continue;  
    33.         else break;  
    34.     }   
    35.     fclose(fp);  
    36.     return 0;  
    37. }</span>  

    执行截图:

               


    ②数据块方式读取:

    演示样例代码:

    1. <span style="font-family:Microsoft YaHei;">#include <stdio.h>  
    2.   
    3. typedef struct  
    4. {  
    5.     int id;  
    6.     char name[20];  
    7.     int age;  
    8. }STU;  
    9.   
    10. int main()  
    11. {  
    12.     STU stu;  
    13.     FILE *fp;  
    14.     if((fp = fopen("test4.data","rb"))== NULL)  
    15.     {  
    16.         printf("文件打开失败! ");  
    17.         exit(1);      
    18.     }  
    19.     //读取存储的学生信息   
    20.     printf("输出文件里的内容: ");  
    21.     printf("学生学号     学生姓名        学生年龄 ");  
    22.     //从fp指向的二进制文件读取数据,每次读取大小为size个字节的数据  
    23.     //运行 1 次;最后将这些数据保存到结构体变量的地址内存中  
    24.     //返回值正常时是读取的数据库个数(count)的值,否则返回0(错误或文件尾)   
    25.     while(fread(&stu,sizeof(stu),1,fp) == 1)  
    26.     {  
    27.         printf("%-15d%-15s%-15d ",stu.id,stu.name,stu.age);  
    28.     }  
    29.     fclose(fp);  
    30.     return 0;  
    31. }</span>  



    ②字输入/输出函数

    getw和putw两个函数并非ANSI C标准定义的函数,但非常多的C语言编译系统都提供这两个函数,

    假设没提供也能够自己写,这个用的不多,就不给出代码演示样例了,仅仅给出函数使用方法:

    putw(n,fp):以二进制的形式将一个int类型的数据写入到fp所指向的二进制文件里! 

      n为写入的整数,运行正常返回写入的整数,否则返回EOF

    getw(fp):从fp指向的二进制文件里以二进制的方式读取一个字

                     运行正常返回所读取的二进制整数,否则返回EOF





    本章小结:

    ①位运算:

    1.什么是位运算,位运算的6个运算符的作用

    2.位运算的使用,原码,补码与反码的概念

    3.位运算的相关应用(取代乘法运算,不使用中间变量等)


    ②文件

    1.为什么要用文件?

    文件的分类

    2.文件类型指针 FILE *fp;

    3.文件打开关闭:  fopen()打开    fclose()关闭

    4.文件的读写操作  1)字符读写:fgetc 和 fputc                      2)字符串读写:fgets 和 fputs

                                      3)格式化读写:fscanf 和 fprintf              4)数据块读写:fwrite 和 fread

              5)字读写(整数) getw和putw

    5.文件定位:   rewind(fp) 移动指针到文件头                  fseek()将指针移动到某个地方

                           ftell(fp)  返回指针的相对位移量


    6.文件状态检查函数:feof(fp)文件是否结束                   ferror(fp)运行输入输出时文件是否出错,返回0表示没出错

        clearerr(fp):又一次设置文件出错标志,无返回值



    本文借鉴:http://blog.csdn.net/coder_pig/article/details/38009813
  • 相关阅读:
    MySQL之数据的备份与还原
    调用、查看、修改、删除存储过程和函数
    变量的使用、游标的使用、流程控制的使用
    存储过程与函数
    elementUI 表格设置表头样式
    oracle先排序再分页
    postgresql行转列
    crosstab(unknown, unknown) does not exist
    sublime安装php_beautifier来格式化PHP代码
    从今天开始我要经常更新博客
  • 原文地址:https://www.cnblogs.com/zsychanpin/p/6815649.html
Copyright © 2020-2023  润新知