C语言8-6删除字符,C语言快速入门系列(8)

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

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

C语言位运算与文件

本章引言:

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

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

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

变量a乘以2,怎么写效率高?直接a *2,很多人都这样写,但是如果你会位运算的话,你会a<<1;

位运算的效率可是比a*2高的哦!另一个问题,不用变量左中间值,直接交换两个变量的值?

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

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

本节学习路线图:

09170195.jpg

位运算:

09170196.jpg

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

等同于a = a&b !

文件:

文本文件的使用方式:

"r"

只读方式打开一个文本文件,只允许度数据,不存在则打开失败

"w"

只写方式打开或建立一个文本文件,只允许写数据

"a"

追加的方式打开一个文本文件,可在文件尾写数据,不存在则创建一个

"r+"

读写方式打开一个文本文件,允许读写,不存在,打开失败

"w+"

读写方式打开或建立一个文本文件,允许读写

"a+"

读写方式打开文本文件,在文件末尾追加数据,不存在则创建一个

ps:对于二进制文件,对应的只要改成在每个后面加上一个b就可以了:

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

文件详细学习图:

09170197.jpg

使用代码示例:

①单个字符写入/读取

写入: fputc()

#include

#include

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;

}

读取:fgetc()

#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;

}

运行截图:

09170198.jpg

ps:如果不写完整路径的话,比如:d:\\c_code\\day 8的话,会在代码所在的目录下生成对应的文本文件!

②读写一个字符串:

写入fputs()

/*

fputs(字符串,fp)

作用:向fp所指的文件中,将字符串写入,'\0'并不写入!

*/

#include

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()

/*

fgets(字符串数组,n,文件指针)

就是:从fp执指向的文件中读取一个长度为n - 1的字符串,

存储在一维字符数组中 ,因为字符串会默认添加一个'\0'

*/

#include

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;

}

运行截图:

09170199.jpg

③格式化读写函数

这个和之前学的scanf()和printf()使用方法一样,但是,前者是针对内存中的数据的;

而fscanf(0和fprintf()则对应文件读写的!

ps:要注意哦!fprintf是将控制台的内容打印到文件中哦!所以是写入

fscanf()是将文件中的内容输入到控制台哦! 所以是读取

写入fprint:

#include

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;

}

读取fscanf()

#include

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;

}

运行截图:

091701100.jpg

二进制文件的读写

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

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

①数据块方式写入:

示例代码:

#include

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;

}运行截图:

091701101.jpg           

091701102.jpg

②数据块方式读取:

示例代码:

#include

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;

}

②字输入/输出函数

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):重新设置文件出错标志,无返回值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值