转载自:http://blog.csdn.net/nowdoit/article/details/6163109
1. 先来几个小的程序!
- /*Test 1*/
- #include <stdio.h>
- #include <stdlib.h>
- int main(int argc,char *argv[])
- {
- printf("%d",3.14);
- printf("%d",(int)3.14);
- return 0;
- }
- /*Test 2*/
- #include <stdio.h>
- #include <stdlib.h>
- int main(int argc,char *argv[])
- {
- char c;
- while(c != 'a')
- {
- c = getchar();
- putchar(c);
- fflush(stdin);
- }
- return 0;
- }
运行Test 1,发现输出的第一个并不是3,第二次输出的才是3。这是因为printf("%d")的格式解析原因;printf不会因为前面的%d,进行类型转换,%d只说明printf按照整型的内存格式对数据进行读取,double型在内存中的存储方式和int型不同,而且double占8个字节,int占4个字节,printf取了前面4个字节。
运行Test 2,发现除了如果一次输入多个字符的话,只能显示一个字符;这就是fflush(stdin)的作用,清空缓冲区!但是这种方式只对部分编译器有效(如VC6),并非所有的编译器都支持这个功能(如gcc)
2. 为什么会存在freopen()这个函数?
这是函数原型:FILE *freopen(char *filename, char *type, FILE *stream);
主要用于文件重定向,比如freopen("1.txt","w",stdout);实现了将标准输出定向到文本1.txt中的目的。
3. 使用%-6.10s打印会有什么效果?
左侧对其,保留10位,如不足10位并且大于6位,则全部显示,如不足六位则占用六位,右侧使用空格补齐!
4. 使用%f打印的时候,存在着四舍五入的情况。
5. 输入/输出函数家族
5.1 单个字符实现
getchar()、putchar():从标准输入读入字符(或者向标准输出输出字符),是函数
getc()、fgetc()、putc()、fputc():接收(或输出)流参数,以宏的方式实现
5.2 一行字符实现
fgets()、gets():前者接收流参数,后者从标准输入读取,二者都是读取一行内容
fputs()、puts():前者输出流到文本中,后者从输出文本到标准输出上,二者都是输出一行内容
6. 格式化输入/输出函数家族
6.1 格式化输入实现
fscanf():接收一个流参数
sscanf():从内存缓冲区中读取
scanf():从标准输入中读取
6.2 格式化输出实现
fprintf()、sprintf()、printf()和上面的是一一对应的。
7. 除了上面处理文本,也就是ascii编码实现的函数外,有专门的对二进制数据进行读写的,分别是fread()和fwrite();
8. 改变流读写顺序和位置函数
ftell()、fseek()、fgetpos()、fsetpos()、rewind()等。
9. 改变缓冲区的设置
setbuf()、setvbuf();后者更为通用。
10. 临时文件等文件命令函数
tmpfile():创建临时文件
tmpnam():创建临时文件名
remove():删除文件
rename():修改文件名
11. 处理错误函数
ferror():出现错误,返回错误信息
clearerr():重置错误状态
12. 如何得到perror函数可能打印的所有错误信息列表?
注:本文中函数名func()只代表函数名,并不能完整的包括返回值以及参数列表情况。如需要请自行查询!