C语言高速入门系列(八)



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="">

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

等同于a = a&b !

文件:

文本文件的使用方式:

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

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

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

文件具体学习图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY29kZXJfcGln/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

使用代码演示样例:

①单个字符写入/读取

写入: 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>

执行截图:

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>

执行截图:

二进制文件的读写

演示样例代码:将学生信息存储到结构体中,然后通过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>

执行截图:

           

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY29kZXJfcGln/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

②数据块方式读取:

演示样例代码:

<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语言高速入门系列(八)的更多相关文章

  1. C语言高速入门系列(二)

    C语言高速入门系列(二) -----转载请注明出处coder-pig 本节引言: 在前面一节中我们对C语言进行了初步的了解,学会了使用IDE进行代码的编写,编译执行! 在这一节中我们会对C语言的基本的 ...

  2. C语言高速入门系列(四)

    C语言高速入门系列(四) C语言数组 ---------转载请注明出处:coder-pig 贴心小提示:假设图看不清晰可右键另存为,应该就非常清晰了; 注意上面的代码都要自己过一遍哦! 本节引言: 经 ...

  3. C语言高速入门系列(一)

    C语言高速入门系列(一)  本系列引言: 本教程的宗旨是将C语言入门的内容进行关键知识点的提纯,将一些笼统的废话去除; 再进行压缩,然后将本章的关键知识点做成路线图的,能够更加方便地掌握学习的方向; ...

  4. C语言高速入门系列(五)

    C语言高速入门系列(五) C语言指针初涉                                           ------转载请注明出处:coder-pig 本节引言: 上一节我们对C ...

  5. 微软云平台windows azure入门系列八课程

    微软云平台windows azure入门系列八课程: Windows Azure入门教学系列 (一): 创建第一个WebRole程序与部署 Windows Azure入门教学系列 (二): 创建第一个 ...

  6. C语言高速入口系列(七)

    C语言高速入口系列(七) C语言指针进阶 本章引言: 在前面第5节中我们对C语言的指针进行了初步的学习理解;作为C语言的灵魂, C指针肯定没那么简单,在这一节中,我们将会对指针进行进一步的学习,比方二 ...

  7. Swift语言高速入门

    Swift语言高速入门(首部同步新版官方API文档和语法的Swift图书,确保代码可编译,作者专家在线答疑,图书勘误实时跟进) 极客学院 编著   ISBN 978-7-121-24328-8 201 ...

  8. spring cloud 入门系列八:使用spring cloud sleuth整合zipkin进行服务链路追踪

    好久没有写博客了,主要是最近有些忙,今天忙里偷闲来一篇. =======我是华丽的分割线========== 微服务架构是一种分布式架构,微服务系统按照业务划分服务单元,一个微服务往往会有很多个服务单 ...

  9. spring cloud 入门系列:总结

    从我第一次接触Spring Cloud到现在已经有3个多月了,当时是在博客园里面注册了账号,并且看到很多文章都在谈论微服务,因此我就去了解了下,最终决定开始学习Spring Cloud.我在一款阅读A ...

随机推荐

  1. linux YUM常用 命令

    语法 yum(选项)(参数) 选项 -h:显示帮助信息: -y:对所有的提问都回答“yes”: -c:指定配置文件: -q:安静模式: -v:详细模式: -d:设置调试等级(0-10): -e:设置错 ...

  2. Mysql 监视工具

    对于开发人员来说,最头大的莫过于 ,你本地没事,线上 错误日志一堆. 尤其是数据库通信那一层.SqlServer 有 sql profile 用来监视对应的server上的通信日志,参数 命令等信息. ...

  3. FCT需求分析

    1. 系统组成 系统从硬件角度看是由芯片.电源,时钟,总线组成, 当中总线分为控制总线和数据总线. 芯片是单个的硬件单元,可实现多种功能.有些功能有性能需求,在计算机系统中大部分功能都须要软件配合. ...

  4. 用PowerDesigner对现有的数据库反向工程建立E-R图

    由于早期的一个项目在数据库设计建立时没有输出为E-R图,偶在对此项目进行二次改造升级时则使用了PD对原有的数据库进行反向工程,即根据数据源将数据库的的所有表生成为E-R图结构,我使用的是PD 15,反 ...

  5. .Net4.0 任务(Task)[转]

    .Net4.0 任务(Task) 任务(Task)是一个管理并行工作单元的轻量级对象.它通过使用CLR的线程池来避免启动专用线程,可以更有效率的利用线程池.System.Threading.Tasks ...

  6. 【转载】微服务架构的基础框架选择:Spring Cloud还是Dubbo?

    微服务框架选型,原文链接请参见:http://blog.didispace.com/microservice-framework/ http://blog.csdn.net/zeb_perfect/a ...

  7. Python学习笔记016——面向对象

    面向对象是指用类来描述一个对象(实例),用类来建立实例与实例的关联关系 对象 : object     实例 : instance 1 类 1.1 什么是类 类是用来描述对象的工具,用类可以创建一个或 ...

  8. 什么是Asterisk,它如何帮助我们的呼叫中心?

    如今的呼叫中心与过去的呼叫中心有很大差异.过去,一间房屋或一座大楼,装上硬接线的POTS电话,招聘几名员工就可以建立一个呼叫中心.如今,这样的情形已经一去不复返,因为有许多新技术让呼叫中心变得更像是一 ...

  9. RHCE7 管理II-4计划将来的Linux任务

    (1) at 一次性的计划任务 语法: # at [参数] [时间] at> 执行的指令 退出at命令 ctrl+d [root@localhost ~]# at now at> mkdi ...

  10. RHEL7 -- NetworkManager

    RHEL7中默认的网络服务是由NetworkManager提供,NetworkManager可以动态控制和配置网络. 网络工具和应用 应用或工具 描述 NetworkManager 默认的网络守护进程 ...