c的输入输出
1.scanf&printf
基本形式:scanf("%d",&a);读取失败返回EOF
占位符:
a.%d:读取10进制整数,跳过前导空白,遇到空格,\n,非数字字符后,终止。
b.%c:读取一个字符,注: 虽会跳过前导空白,但开始读入后不会跳过换行空格空白,所以容易遇到一直输入未结束的情况
c.%s:读取数个字符,遇到空格或者换行结束
d.%lf,%f,分别对应double和float,跳过前导空白,读取小数,科学计数法
e.%x,读取16进制,识别0x前缀,%o,八进制
f.%ld,%lld,对应long,long long
引号内部:
注意,引号内不宜放其他东西,比如scanf("%d,%d",x,y);
输入4 3不行,系统会读入4之后等待,停下。4,3可以正常输入
带格式输出
%
+标志
-向左对齐,没打就是默认向右对齐;
0 空位补零;
+:在正数前加上加号;
space:在正数前加上空格;
#:对于八进制数和十六进制数,显示前缀(0和0x)。)
+最小字符宽度
+.
+精度
+长度修饰符(h短整型;l长;ll长长)
+转换说明符(d=i 十进制整数;u无符号十进制整数(注意,是负数,比如-12,输出2^32-12,传递的必须是无符号变量);f浮点数;c字符;s字符串;p指针;o八进制(输入值转化);x十六进制;e科学计数法;c单个字符;g自动选择e/f。
注意%6d和%.6d是不一样的。%6d会在前面补空格,而%.6d补零。000010和 10.
能用double就不用float,损失的精度小得多
i与d的区别:printf里面完全一样,但是scanf里面i可以处理8,10,16进制,但是可能把0123识别成8进制
重定向文件输入freopen
替换stream为某流,后续都改变流
比如if(!freopen("in.txt","r",stdin)),将后续stdin(键盘)读入改为in.txt读入
filename文件名,可以是路径 ..\in.txt,D:\in.txt,.\in.txt
也可以是"CON"表示回到终端,比如 freopen("CON", "w", stdout);,输出到终端
mode输入模式,有:
mode |
功能 |
|---|---|
"r" |
只读(文件必须存在) |
"w" |
只写(创建新文件或清空已有文件) |
"a" |
追加(写入到文件末尾) |
"r+" |
读写(文件必须存在) |
"w+" |
读写(创建新文件或清空已有文件) |
"a+" |
读写追加(写入到文件末尾,读取可从头开始) |
stream有stdin,stdout,stderr
非重定向fopen
这个方式灵活,不用重定向,fscanf和scanf可混杂用
FILE fin,fout;
fin=fopen("data.in","r");
fout=fopen("data.out","w");
文件指针fin和fout继承data.in和data.out的流
fscanf(fin,"%d,&x);
fprintf(fout,"%d",x);
和正常scanf,printf差不多,只是多了个文件指针参数
fin=stdin;
fscanf即为scanf.
fclose(fin);
fclose(fout);
fgetc和fgets
FILE *fin
fgetc(fin),返回字符的整数值,需char强制转换,读取失败返回EOF
fgets(arr,maxn,fin)读取fin完整一行,放在arr[maxn]里面,结尾补上\n,\0;,读取失败返回NULL
fin为stdin的时候即为从键盘读取完整一行

浙公网安备 33010602011771号