关于C语言如何做文件和底层操作:
文件操作,从根本上说,和C语言无关。这部分的内容,是教你如何使用C语言的标准库所提供的一系列函数来操作文件,最基本的最原始的文件操作。你需要理解,我们在这部分所学习的,是函数库的使用,而非C语言。顺便我们还学习了很多和计算机相关的知识,比如重定向、文本文件和二进制文件的江湖恩怨。但是既然不是C语言,也就意味着你将来的工业环境下,未必还会使用这么原始的文件操作函数了。这些函数,只是一个标本,让你知道可以这样来操纵文件。但是,不见得所有的库都是以这样的方式来操纵文件的。
围绕文件操作,还有一个C语言受时代局限,处理得不够好的东西,就是错误处理。因为文件操作的每一个步骤都很可能在实行过程中遇到问题:文件打不开啦,读了一半出错啦,等等等等,所以设计文件操作函数如何反馈和处理这类运行时刻的问题是需要很好的手段的。C的这个函数库,主要是通过特殊的返回值来实现的。后来的语言,如C++和Java,则引入了异常机制来处理这些事情。
关于底层操作,我们主要是介绍了按位操作,包括按位的运算、移位和位段。这些操作在日常程序中难得遇到,主要是用于接触硬件的底层程序的。这些内容在本课程是选读的。
格式化的输入输出
printf和scanf在第一节课就学过,进行输入与输出,在使用这两个函数时,使用%后加字母来表示输出格式,比如%d表示整数的输出格式,那么其实在%和d之间还可以加入一些东西,下面研究下该格式字符串的详细细节:
printf
[flags]
%[flags][width][.prec][hlL]type
在%和type(d等)之间还可以有4样东西,其中flags标号有四种内容,flags和width是一伙的,做程序一起讲解下:
flags=-
#include <stdio.h>
int main(int argc,char const *argv[]){
printf("%9d
",123); //9的意思是数据的输出占据9个字符的空间,是右对齐的
printf("%-9d
",123); //减号的意思是左对齐
}
运行结果如下,数一下在123前面有6个字符:
123
123
--------------------------------
Process exited after 0.006233 seconds with return value 10
请按任意键继续. . .
flags=+
减号的意思是左对齐,flags=+,加号的意思是在前面放+或者-,修改上述程序:
#include <stdio.h>
int main(int argc,char const *argv[]){
printf("%+9d
",123);
printf("%+-9d
",123); //又有+,又左对齐。写成%-+9d结果是一致的
}
输出结果为:
+123
+123
--------------------------------
Process exited after 0.00621 seconds with return value 10
请按任意键继续. . .
flags=0,意思是0填充:
#include <stdio.h>
int main(int argc,char const *argv[]){
printf("%09d
",123);
printf("%0-9d
",123);
}
运行结果如下,可以看出第一个printf填充了0,但是第二个没用填充,所以0和-是同时使用,有效的是-。
000000123
123
--------------------------------
Process exited after 0.006748 seconds with return value 10
请按任意键继续. . .
[width][.prec]:
####.prec=.2 ``` #includeint main(int argc,char const *argv[]){
printf("%9.2f
",123.0);
}
运行结果如下:
123.00
Process exited after 0.006753 seconds with return value 10
请按任意键继续. . .
从结果可以看出9并不是小数点前有9位,而是整个数据占据9个字符,.2是说小数点后有两位。
####width=*
include <stdio.h>
int main(int argc,char const argv[]){
printf("%9.2f
",123.0);
printf("%d
",6,123);//号意思是后面的6是填充到所在位置,也就是数组整个占据6个字符,那么此处的6也可以替换为变量len,比如可写成
//printf("%*d
",len,123);这样可对输出格式进行扩展。
}
运行结果如下:
123.00
123
Process exited after 0.01804 seconds with return value 7
请按任意键继续. . .
###[hlL]修饰符,修饰类型type
<img src="http://images2015.cnblogs.com/blog/1106248/201703/1106248-20170329112403983-246551374.png" width = "50%" />
####hlL=hh
hlL=hh是当作单个字节来输出,例如:
include <stdio.h>
int main(int argc,char const *argv[]){
printf("%hhd
",(char)12345);
}
输出结果是57,将12345的低位作为char输出,并将该char转换为10进制整数结果就是57.(12345的16进制结果是3039,将0x39转换为十进制为57)
###type
<img src="http://images2015.cnblogs.com/blog/1106248/201703/1106248-20170329112528420-57328523.png" width = "60%" />
##scanf
scanf相对printf简单一些,scanf:%[flags]type,只有flags和type两个参数,涉及到每个选项可以做实验测试,
<img src="http://images2015.cnblogs.com/blog/1106248/201703/1106248-20170329114723561-1630781252.png" width = "60%" />
<img src="http://images2015.cnblogs.com/blog/1106248/201703/1106248-20170329114803092-1306271511.png" width = "60%" />