C语言位运算与文件

本章引言:

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

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

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

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

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

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

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

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

本节学习路线图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY29kZXJfcGln/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" style="border:none; max-width:100%">

位运算:

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("文件打开失败!\n");
  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("文件打开失败!\n");
  10. exit(1);
  11. }
  12. //EOF是文件结尾的标志,此处是推断是否到文件尾
  13. while((c = fgetc(fp)) != EOF)
  14. {
  15. printf("%c",c);
  16. n++;
  17. }
  18. printf("\n");
  19. fclose(fp);
  20. return 0;
  21. } </span>

执行截图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY29kZXJfcGln/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" style="border:none; max-width:100%">

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

②读写一个字符串:

写入fputs()

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

读取:fgets()

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

执行截图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY29kZXJfcGln/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" style="border:none; max-width:100%">

二进制文件的读写

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

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

①数据块方式写入:

演示样例代码:

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

执行截图:

 
         

②数据块方式读取:

演示样例代码:

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

C(8)的更多相关文章

  1. Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求

    上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...

  2. Angular2学习笔记(1)

    Angular2学习笔记(1) 1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之 ...

  3. ASP.NET Core 之 Identity 入门(一)

    前言 在 ASP.NET Core 中,仍然沿用了 ASP.NET里面的 Identity 组件库,负责对用户的身份进行认证,总体来说的话,没有MVC 5 里面那么复杂,因为在MVC 5里面引入了OW ...

  4. ABP入门系列(1)——学习Abp框架之实操演练

    作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...

  5. Online Judge(OJ)搭建(第一版)

    搭建 OJ 需要的知识(重要性排序): Java SE(Basic Knowledge, String, FileWriter, JavaCompiler, URLClassLoader, Secur ...

  6. 如何一步一步用DDD设计一个电商网站(九)—— 小心陷入值对象持久化的坑

    阅读目录 前言 场景1的思考 场景2的思考 避坑方式 实践 结语 一.前言 在上一篇中(如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成),有一行注释的代码: public interfa ...

  7. 如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成

    阅读目录 前言 建模 实现 结语 一.前言 前面几篇已经实现了一个基本的购买+售价计算的过程,这次再让售价丰满一些,增加一个会员价的概念.会员价在现在的主流电商中,是一个不大常见的模式,其带来的问题是 ...

  8. 【.net 深呼吸】细说CodeDom(5):类型成员

    前文中,老周已经厚着脸皮介绍了类型的声明,类型里面包含的自然就是类型成员了,故,顺着这个思路,今天咱们就了解一下如何向类型添加成员. 咱们都知道,常见的类型成员,比如字段.属性.方法.事件.表示代码成 ...

  9. 【.net 深呼吸】细说CodeDom(4):类型定义

    上一篇文章中说了命名空间,你猜猜接下来该说啥.是了,命名空间下面就是类型,知道了如何生成命名空间的定义代码,之后就该学会如何声明类型了. CLR的类型通常有这么几种:类.接口.结构.枚举.委托.是这么 ...

  10. 【.net 深呼吸】细说CodeDom(2):表达式、语句

    在上一篇文章中,老周厚着脸皮给大伙介绍了代码文档的基本结构,以及一些代码对象与CodeDom类型的对应关系. 在评论中老周看到有朋友提到了 Emit,那老周就顺便提一下.严格上说,Emit并不是针对代 ...

随机推荐

  1. jQuery添加删除节点例子第十节"员工增删表"

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  2. webStorm恢复误删除文件或工程

    背景: 提交git时可能由于没有提交所有文件,不知什么原因导致最近几天所写文件全部消失,所改文件全部恢复到以前.最终通过webstorm找回项目.下面总结通过webstorm找回误删文件,或恢复到历史 ...

  3. C#设计模式之十四模板方法模式(Template Method)【行为型】

    一.引言 “结构型”的设计模式已经写完了,从今天我们开始讲“行为型”设计模式.现在我们开始讲[行为型]设计模式的第一个模式,该模式是[模板方法],英文名称是:Template Method Patte ...

  4. java操作solr实现查询功能

    一.封装的查询方法 /** * solr查询方法 * @param client solr客户端 * @param query solr查询对象 * @return list集合 * @throws ...

  5. pattern

    A compiled representation of a regular expression. A regular expression, specified as a string, must ...

  6. open_basedir restriction in effect.文件访问没有权限异常

    本次搭建公司web开发环境遇到了不少坑首先认为可能是设置的目录写入权限问题,后面解决了发现不是 问题在于nginx配置文件进行了网站目录的保护 配置文件/usr/local/nginx/conf/fa ...

  7. 《java.util.concurrent 包源码阅读》23 Fork/Join框架之Fork的冰山一角

    上篇文章一直追踪到了ForkJoinWorkerThread的pushTask方法,仍然没有办法解释Fork的原理,那么不妨来看看ForkJoinWorkerThread的run方法: public ...

  8. 《Linux命令行与shell脚本编程大全》第十六章 控制脚本

    一些控制脚本的方式:向脚本发送信号.修改脚本优先级,在脚本运行时切换到运行模式 16.1 处理信号 linux利用信号与运行在系统中的进程进行通信. 也可以通过对脚本进行编程,使其在收到特定信号时执行 ...

  9. MySQL分类表设计--根据ID删除全部子类

    在做数据库分类表的时候,通常会有这样的设计:一个字段是ID,另一个字段PID,PID指向自己的上级分类: 这样的设计带来的问题是:我要删除一个类,我希望它的子类全部一起删除: 在不知道分类有多少层级的 ...

  10. 条件随机场 Conditional Random Fields

    简介 假设你有冠西哥一天生活中的照片(这些照片是按时间排好序的),然后你很无聊的想给每张照片打标签(Tag),比如这张是冠西哥在吃饭,那张是冠西哥在睡觉,那么你该怎么做呢? 一种方法是不管这些照片的序 ...