小猪的C语言快速入门系列(八)
2017-10-17 16:32
267 查看
小猪的C语言快速入门系列(八)
标签: C语言本节引言:
本节讲解的是C语言中的位运算与文件,相信这两章对于部分童鞋来说是陌生的,
因为很多大学的老师都会选择跳过这两个知识点,其实这两个知识点也是非常
重要的,比如位运算,比如让你算a*2,怎么写效率(装逼)高,如果你会位运算
你会 a<<1,效率可比a*2高哦,另外一个常见的问题,怎么不使用中间值
变量交换两个变量的值?而文件操作的重要性也不用说吧,一般期末都会让你
做一个xx管理系统之类的东东,存取文件基本是必不可少的!
本节学习路线图
位运算
Tips:
位运算符并不改变自身的值,如果你想要改变自身的值,可以在运算符的后面
加上等号: a &= b; 等价于 a = a & b;
文件
1.文本文件的使用方式
读写字符 | 作用 |
---|---|
“r” | 只读方式打开一个文本文件,只允许度数据,不存在则打开失败 |
“w” | 只写方式打开或建立一个文本文件,只允许写数据 |
“a” | 追加的方式打开一个文本文件,可在文件尾写数据,不存在则创建一个 |
“r+” | 读写方式打开一个文本文件,允许读写,不存在,打开失败 |
“w+” | 读写方式打开或建立一个文本文件,允许读写 |
“a+” | 读写方式打开文本文件,在文件末尾追加数据,不存在则创建一个 |
2.文件详细学习图
3.使用代码示例
单个字符写入(fputc())/读取(
fgetc())
#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; }
#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; }
运行结果:
PS:如果不写完整路径的话,比如:
d:\\c_code\\day 8的话,会在代码所在的
目录下生成对应的文件。
读(
fgets())写(
fputs())一个字符串
/* 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; }
/* 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; }
运行结果:
格式化读(
fprintf)写(
fscanf)函数
这个和前面学的scanf和printf使用方法是一样的,不过前者们
是针对内存中的数据的!而后者是针对文件读写的,fprintf是
将控制台的内容打印到文件中,所以是写入,fscanf则是将
文件的内容输入到控制台,所以是读取。
#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; }
#include <stdio.h> int main() { //这里很容易出问题,所以我并不喜欢用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; }
运行结果:
二进制文件的读写
数据块方式写入(
fwrite())与读取(
fread())
代码示例:
将学生信息存储到结构体中,然后通过fwrite()函数将结构体内容写入文件中;
在通过fread()函数读取出来
#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; }
#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; }
输出结果:
字写入(
putw(n,fp))/读取(
getw(fp))函数
getw与putw两个函数并不是ANSI C标准定义的函数,但很多C语言编译系统都有
提供这两个函数,如果没有提供也可以自己写,这个用得不多,就不给出具体
代码示例了,只给出函数的用法介绍。
putw(n,fp):以二进制的形式将一个int类型的数据写入到fp所指向的
二进制文件中! n为写入的整数,执行正常返回写入的整数,否则返回EOF
getw(fp):从fp指向的二进制文件中以二进制的方式读取一个字
执行正常返回所读取的二进制整数,否则返回EOF
本文链接:小猪的C语言快速入门系列(八)
作者:Coder-Pig
出处:http://blog.csdn.net/coder_pig
本文基于知识共享署名-相同方式共享 4.0 国际许可协议发布,欢迎转载,
演绎或用于商业目的,但是必须保留本文的署名及链接。åç
相关文章推荐
- 小猪的C语言快速入门系列(五)
- 小猪的C语言快速入门系列(一)
- 小猪的C语言快速入门系列(三)
- 小猪的C语言快速入门系列(四)
- 小猪的C语言快速入门系列(七)
- 小猪的C语言快速入门系列(六)
- 小猪的C语言快速入门系列(二)
- 小猪的C语言快速入门系列(九)
- C语言快速入门系列-详解
- Spring Boot 系列(一)快速入门
- CSLA.NET快速入门系列——实现DataPortal扩展(三)
- 快速入门系列--CLR--03泛型集合
- Docker系列教程21-Docker Compose快速入门
- Sencha Touch 2 快速入门系列(八) -- 控制器(Controller)
- 我给女朋友讲编程html系列(1) -- Html快速入门
- Gradle学习系列之一——Gradle快速入门
- CSLA.NET快速入门系列——DataPortal实现模式
- Sencha Touch 2 快速入门系列(九) -- 配置(Profile)
- Netty 快速入门系列 - Chapter 1 传统OIO与NIO - 传统OIO 【第一讲】
- Netty 快速入门系列 - Chapter 2 Netty3.x 【第四讲】 - 基本原理