位运算
运用
按位与常用于对某些位清零或保留某些位,例如把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_SET | 0 |
当前位置 | SEEK_CUR | 1 |
文件末尾 | SEEk_END | 2 |
例如:
fseek(fp,100L,0);
意义是把位置指针移到离文件首100个字节处。一般用于二进制文件,文本文件中要进行转换,往往计算的位置会出现错误。