在线C环境:https://clin.icourse163.org/
格式化输⼊输出
2. printf和scanf的返回值
- 读⼊的项目数
- 输出的字符数
- 在要求严格的程序中,应该判断每次调⽤scanf或 printf的返回值,从⽽了解程序运⾏中是否存在问题
3. ⽂件输⼊输出
⽤>和<做重定向
4. 输⼊结束
getchar读到了EOF
scanf返回⼩于要求读的数量
5. FILE
FILE* fopen(const char * restrict path, const char * restrict mode);
int fclose(FILE *stream);
fscanf(FILE*, ...)
fprintf(FILE*, ...)
6.打开⽂件的标准代码
7. fopen
8. ⼆进制⽂件
- 其实所有的⽂件最终都是⼆进制的
- ⽂本⽂件⽆⾮是⽤最简单的⽅式可以读写的⽂件
- more、tail
- cat
- vi
- ⽽⼆进制⽂件是需要专⻔的程序来读写的⽂件
- ⽂本⽂件的输⼊输出是格式化,可能经过转码
9.⽂本 vs ⼆进制
- Unix喜欢⽤⽂本⽂件来做数据存储和程序配置
- 交互式终端的出现使得⼈们喜欢⽤⽂本和计算机 “talk”
- Unix的shell提供了⼀些读写⽂本的⼩程序
- Windows喜欢⽤⼆进制⽂件
- DOS是草根⽂化,并不继承和熟悉Unix⽂化
- PC刚开始的时候能⼒有限,DOS的能⼒更有限,⼆ 进制更接近底层
- ⽂本的优势是⽅便⼈类读写,⽽且跨平台
- ⽂本的缺点是程序输⼊输出要经过格式化,开销⼤
- ⼆进制的缺点是⼈类读写困难,⽽且不跨平台
- int的⼤⼩不⼀致,⼤⼩端的问题...
- ⼆进制的优点是程序读写快
10.程序为什么要⽂件
- 配置
- Unix⽤⽂本,Windows⽤注册表
- 数据
- 稍微有点量的数据都放数据库了
- 媒体
- 这个只能是⼆进制的
- 现实是,程序通过第三⽅库来读写⽂件,很少直接读 写⼆进制⽂件
11. ⼆进制读写
12. 为什么nitem?
- 因为⼆进制⽂件的读写⼀般都是通过对⼀个结构变量 的操作来进⾏的
- 于是nitem就是⽤来说明这次读写⼏个结构变量!
13. 在⽂件中定位
- long ftell(FILE *stream);
- int fseek(FILE *stream, long offset, int whence);
- SEEK_SET:从头开始
- SEEK_CUR:从当前位置开始
- SEEK_END:从尾开始(倒过来)
14. 可移植性
- 这样的⼆进制⽂件不具有可移植性
- 在int为32位的机器上写成的数据⽂件⽆法直接在int 为64位的机器上正确读出
- 解决⽅案之⼀是放弃使⽤int,⽽是typedef具有明确 ⼤⼩的类型
- 更好的⽅案是⽤⽂本
位运算
1. 按位运算
C有这些按位运算的运算符:
& 按位的与
| 按位的
~ 按位取反或
^ 按位的异或
<< 左移
>> 右移
2. 按位与 &
3. 按位或 |
4. 按位取反 ~
5. 逻辑运算vs按位运算
6. 左移 <<
7. 右移 >>
no zuo no die
8.输出⼀个数的⼆进制
9. 位段
- 可以直接⽤位段的成员名称来访问
- ⽐移位、与、或还⽅便
- 编译器会安排其中的位的排列,不具有可移植性
- 当所需的位超过⼀个int时会采⽤多个int