C语言学习易错点总结(八)---位运算与文件

位运算

运用

按位与常用于对某些位清零或保留某些位,例如把a的高八位清0,保留低八位,可以用a&255。
“^“是异或运算符,”~“是求反运算符。
“<<”(”>>”)左移(右移)运算符,将符号左边的运算数移动若干位(由运算符右边的数指定)。左移的高位丢弃,低位补0。右移时,对于有符号数,符号位随同移动。当为正数时,最高位补0,而为负数时,符号位为1,最高位补0或是补1取决于编译系统的规定。

位域(位段)

有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。

//定义
struct 位域结构名
	{位域列表};
//位域列表的形式
类型说明符 位域名:位域长度

struct bs
{
	int a:8;
	int b:2;
	int c:6;
};

1.一个位域结构必须存储于同一个字节中,不能跨两个字节。

struct bs
{
	int a:5;
	int b:4;//非法,可以在a后面加int :3或int :0前一个表示3位不能使用,后一个表示余下的位不能使用,
	//强制从下一单元开始
}

2.由于位域不允许跨两个字节,因此位域的长度不能大于一个字节长度(8位)。
3.位域可以无位域名,此时它只能用来作填充或调整位置。
位域的使用方法与结构体无异。

文件

按照编码方式,文件分为ASII文件(文本文件)和二进制文件。

文件指针

FILE *fp;

文件的打开与关闭

fopen

FILE *fp;
fp = fopen(文件名,使用文件方式);
fp = fopen("C:\\hzk16","rb");
文件使用方式意义
rt只读打开一个文本文件
wt只写打开或建立一个文本文件
at追加打开一个文本文件,在文件末尾写数据
rb只读打开一个二进制文件
wb只写打开或建立一个二进制文件
ab追加打开一个二进制文件,并在文件末尾写数据

在使用方式后带+,表示允许读写。例如,rt+,表示读写打开一个文本文件。
须知:
1.r(read) w(write) a(append) t(text) b(binary) +读和写
2.读文件的前提,必须存在这个文件
3.写文件如果没有这个文件,则新建这个文件,如果存在,则删去后新建。
4.追加也必须存在这个文件。
5.打开文件时,如果出错,fopen将返回NULL

if(fp=fopen("C:\\hzk16","rb")==NULL)
	printf("出错!");

fclose

fclose(fp);

文件的读写

fgetc和fputc

char ch = fgetc(fp);

在文件内部有一个位置指针,用来指向文件的当前读写位置。文件打开时总是指向当前第一个字节,使用一次fgetc向后自动移动。

fputc('a',fp);

fputc有一个返回值,如写入成功则返回写入的字符,否则返回一个EOF。

fgets和fputs

char a[10];
fgets(a,10,fp);//从文件中读出9个字符送入a中,数组的最后一位填"\0" 

如果遇到换行符或EOF,则提前结束读出。

fputs("abcd",fp);//"abcd"还可以为字符数组名,指针名。

fread 和fwrite

fread(buffer,size,count,fp);
fwiter(buffer,size,count,fp);

其中buffer是指针,在fread中表示存放输入数据的首地址,在fwrite中,表示存放输出数据的首地址。size表示数据块(输入或输出)的字节数,count表示数据块块数。例如:fread(fa,4,5,fp)表示每次读4个字节送入fa中,连续读5次,即读5个实数到fa中。

fscanf和fprintf

fscanf(文件指针,格式化字符串,输入表列);
fprintf(文件指针,格式化字符串,输出表列);
fscanf(fp,"%d%s",&i,s);
fprintf(fp,"%d%c",j,ch);

一次只能读取一个数据元素。

随机读写

文件定位

rewind(文件指针);//把文件内部的位置移到文件首
fseek(文件指针,位移量,起始点);
起始点表示符号数字表示
文件首SEEK_SET0
当前位置SEEK_CUR1
文件末尾SEEk_END2

例如:
fseek(fp,100L,0);
意义是把位置指针移到离文件首100个字节处。一般用于二进制文件,文本文件中要进行转换,往往计算的位置会出现错误。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值