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()
- <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);
- }
-
- 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;">
-
-
-
-
- #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;">
-
-
-
-
-
-
- #include <stdio.h>
- int main()
- {
- FILE *fp;
- char str[20];
- if((fp = fopen("test2.txt","r")) == NULL)
- {
- printf("文件打开失败!\n");
- exit(1);
- }
-
- 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()
- {
-
- 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);
- }
-
-
- 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>
运行截图:
②数据块方式读取:
示例代码:
- <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");
-
-
-
- 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):重新设置文件出错标志,无返回值
本文借鉴:http://blog.csdn.net/coder_pig/article/details/38009813