C(8)
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()
- <span style="font-family:Microsoft YaHei;">#include <stdio.h>
- #include <string.h>
- int main()
- {
- FILE *fp;
- char str[] = "Write The Data to File!";
- int index = 0;
- fp = fopen("test1.txt","w");
- if(fp == NULL)
- {
- printf("文件打开失败!\n");
- exit(1);
- }
- //由于是一个个字符输入的,所以要获得长度
- while(index < strlen(str))
- fputc(str[index++],fp);
- fclose(fp);
- return 0;
- } </span>
读取:fgetc()
- <span style="font-family:Microsoft YaHei;">#include "stdio.h"
- int main()
- {
- FILE *fp;
- char c;
- int n = 1;
- if((fp = fopen("test1.txt","r")) == NULL)
- {
- printf("文件打开失败!\n");
- exit(1);
- }
- //EOF是文件结尾的标志,此处是推断是否到文件尾
- while((c = fgetc(fp)) != EOF)
- {
- printf("%c",c);
- n++;
- }
- printf("\n");
- fclose(fp);
- return 0;
- } </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()
- <span style="font-family:Microsoft YaHei;">/*
- fputs(字符串,fp)
- 作用:向fp所指的文件里,将字符串写入,'\0'并不写入!
- */
- #include <stdio.h>
- int main()
- {
- char str[] = "通过fputs方法往文件里写入信息!";
- FILE *fp = fopen("test2.txt","w");
- if(fp == NULL)
- {
- printf("文件打开失败!\n");
- exit(1);
- }
- fputs(str,fp);
- fclose(fp);
- return 0;
- }</span>
读取:fgets()
- <span style="font-family:Microsoft YaHei;">/*
- fgets(字符串数组,n,文件指针)
- 就是:从fp执指向的文件里读取一个长度为n - 1的字符串,
- 存储在一维字符数组中 ,由于字符串会默认加入一个'\0'
- */
- #include <stdio.h>
- int main()
- {
- FILE *fp;
- char str[20];
- if((fp = fopen("test2.txt","r")) == NULL)
- {
- printf("文件打开失败!\n");
- exit(1);
- }
- //这里写3是由于,汉字是占2个字节的
- while(fgets(str,3,fp) != NULL)
- printf("%s",str);
- printf("\n");
- fclose(fp);
- return 0;
- }</span>
执行截图:
③格式化读写函数
这个和之前学的scanf()和printf()用法一样,可是,前者是针对内存中的数据的;
而fscanf(0和fprintf()则相应文件读写的!
ps:要注意哦!fprintf是将控制台的内容打印到文件里哦!所以是写入
fscanf()是将文件里的内容输入到控制台哦! 所以是读取
写入fprint:
- <span style="font-family:Microsoft YaHei;">#include <stdio.h>
- int main()
- {
- char c[] = "Today is 2014 July ";
- int day = 22;
- char a = 't',b = 'h';
- FILE *fp;
- if((fp = fopen("test3.txt","w"))== NULL)
- {
- printf("文件打开失败!\n");
- exit(1);
- }
- fprintf(fp,"%s%d %c%c",c,day,a,b);
- fclose(fp);
- return 0;
- }</span>
读取fscanf()
- <span style="font-family:Microsoft YaHei;">#include <stdio.h>
- int main()
- {
- //这里非常easy出问题,所以我并不喜欢用fscanf这个函数
- char c1[5],c2[5],c3[5],c4[5],c5[5],c6[5];
- int day,year;
- FILE *fp;
- if((fp = fopen("test3.txt","r"))== NULL)
- {
- printf("文件打开失败!\n");
- exit(1);
- }
- //这个要依照读取的文件的格式写,我弄了N久还是不行
- //就直接用6个字符串了...
- fscanf(fp,"%s%s%s%s%s%s",&c1,&c2,&c3,&c4,&c5,&c6);
- printf("%s %s %s %s %s %s\n",c1,c2,c3,c4,c5,c6);
- fclose(fp);
- return 0;
- }</span>
执行截图:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY29kZXJfcGln/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" style="border:none; max-width:100%">
二进制文件的读写
演示样例代码:将学生信息存储到结构体中,然后通过fwrite()函数将结构体内容写入文件里;
在通过fread()函数读取出来
①数据块方式写入:
演示样例代码:
- <span style="font-family:Microsoft YaHei;">#include <stdio.h>
- typedef struct
- {
- int id;
- char name[20];
- int age;
- }STU;
- int main()
- {
- STU stu;
- FILE *fp;
- char c;
- //内容是追加的!
- if((fp = fopen("test4.data","ab"))== NULL)
- {
- printf("文件打开失败!\n");
- exit(1);
- }
- //录入多个学生的信息:
- while(1)
- {
- printf("请输入学号: ");scanf("%d",&stu.id);
- printf("\n请输入姓名: ");scanf("%s",&stu.name);
- printf("\n请输入年龄: ");scanf("%d",&stu.age);
- //參数依次是: 数据起始地址,每次写入的数据块的字节数,数据块的数目,文件指针
- fwrite(&stu,sizeof(stu),1,fp);
- printf("\n继续输入?(Y/N)\n");
- getchar();
- c = getchar();
- if(c == 'y' || c == 'Y')continue;
- else break;
- }
- fclose(fp);
- return 0;
- }</span>
执行截图:
②数据块方式读取:
演示样例代码:
- <span style="font-family:Microsoft YaHei;">#include <stdio.h>
- typedef struct
- {
- int id;
- char name[20];
- int age;
- }STU;
- int main()
- {
- STU stu;
- FILE *fp;
- if((fp = fopen("test4.data","rb"))== NULL)
- {
- printf("文件打开失败!\n");
- exit(1);
- }
- //读取存储的学生信息
- printf("输出文件里的内容:\n");
- printf("学生学号 学生姓名 学生年龄\n");
- //从fp指向的二进制文件读取数据,每次读取大小为size个字节的数据
- //运行 1 次;最后将这些数据保存到结构体变量的地址内存中
- //返回值正常时是读取的数据库个数(count)的值,否则返回0(错误或文件尾)
- while(fread(&stu,sizeof(stu),1,fp) == 1)
- {
- printf("%-15d%-15s%-15d\n",stu.id,stu.name,stu.age);
- }
- fclose(fp);
- return 0;
- }</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):又一次设置文件出错标志,无返回值
C(8)的更多相关文章
- Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求
上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...
- Angular2学习笔记(1)
Angular2学习笔记(1) 1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之 ...
- ASP.NET Core 之 Identity 入门(一)
前言 在 ASP.NET Core 中,仍然沿用了 ASP.NET里面的 Identity 组件库,负责对用户的身份进行认证,总体来说的话,没有MVC 5 里面那么复杂,因为在MVC 5里面引入了OW ...
- ABP入门系列(1)——学习Abp框架之实操演练
作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...
- Online Judge(OJ)搭建(第一版)
搭建 OJ 需要的知识(重要性排序): Java SE(Basic Knowledge, String, FileWriter, JavaCompiler, URLClassLoader, Secur ...
- 如何一步一步用DDD设计一个电商网站(九)—— 小心陷入值对象持久化的坑
阅读目录 前言 场景1的思考 场景2的思考 避坑方式 实践 结语 一.前言 在上一篇中(如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成),有一行注释的代码: public interfa ...
- 如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成
阅读目录 前言 建模 实现 结语 一.前言 前面几篇已经实现了一个基本的购买+售价计算的过程,这次再让售价丰满一些,增加一个会员价的概念.会员价在现在的主流电商中,是一个不大常见的模式,其带来的问题是 ...
- 【.net 深呼吸】细说CodeDom(5):类型成员
前文中,老周已经厚着脸皮介绍了类型的声明,类型里面包含的自然就是类型成员了,故,顺着这个思路,今天咱们就了解一下如何向类型添加成员. 咱们都知道,常见的类型成员,比如字段.属性.方法.事件.表示代码成 ...
- 【.net 深呼吸】细说CodeDom(4):类型定义
上一篇文章中说了命名空间,你猜猜接下来该说啥.是了,命名空间下面就是类型,知道了如何生成命名空间的定义代码,之后就该学会如何声明类型了. CLR的类型通常有这么几种:类.接口.结构.枚举.委托.是这么 ...
- 【.net 深呼吸】细说CodeDom(2):表达式、语句
在上一篇文章中,老周厚着脸皮给大伙介绍了代码文档的基本结构,以及一些代码对象与CodeDom类型的对应关系. 在评论中老周看到有朋友提到了 Emit,那老周就顺便提一下.严格上说,Emit并不是针对代 ...
随机推荐
- HTML 3秒一换轮播(鼠标选中旋转停止定时) 动画案例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Problem B: 大整数的加法运算
Problem B: 大整数的加法运算 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 112 Solved: 57[Submit][Status][W ...
- 小米Java程序员第二轮面试10个问题,你是否会被刷掉?
近日,开发者头条上分享了一篇"小米java第二轮面经",有很多的java程序员表示非常有兴趣. 下面l就和各位分享小米java第二轮面经(华为java工程师笔试面试题可以看文章某尾 ...
- JSOUP教程,JSOUP 乱码处理,JSOUP生僻字乱码解决方案
JSOUP乱码情况产生 这几天我用 JSOUP 多线程的方式,爬取了200 多万数据,数据为各地的地名相关.结果有小部分数据,不到 1 万乱码.我先检查了我的编码为UTF-8 ,觉得应该没有问题.代码 ...
- Servlet的理解
一.什么是Servlet? Servlet是用Java编写的web组件,实际上可以简单的理解为是用来处理请求的,为什么这么说,看了它的生命周期就知道了. 二.常见的Servlet容器 4容器顾名思义是 ...
- Javascript判断数据类型与真假值隐形转换研究
一.引言 我们在开发的时候经常要判断真和假,这是我们经常写的代码: if(a){ alert(1) } 那我们怎么判定a是真还是假呢?下面这些值的真假又是多少呢?它们的数据类型又是怎样的呢? &quo ...
- Spring学习日志之Bean的装配
Spring容器负责创建应用程序中的bean并通过依赖注入来协调这些对象之间的关系.但是,作为开发人员,要告诉Spring需要创建哪些bean并且如何将其装配在一起.当描述bean如何装配时,Spri ...
- [array] leetCode-4-Median of Two Sorted Arrays-Hard
leetCode-4-Median of Two Sorted Arrays-Hard descrition There are two sorted arrays nums1 and nums2 o ...
- cocoaPods打包的静态库
cocoaPods管理自己的静态库供其它人下载使用(直接使用上一篇用cocoaPod打包的静态库)(1) 创建github仓库 (2) 下载仓库到本地 (3) 将打包好的framework放到项目中 ...
- 电商SEO
大家都知道网站有SEO,电商也有SEO,今天陈晨就带大家来讲讲电商SEO的思路以及电商最重要的选品规划! 1. 选品是核心 2. 挖掘卖点是你走向成功必经之路 3. 产品定价策略---人群画像 4. ...