格式化输入输出
1.
fprintf
(格式化输出数据至文件)
相关函数
printf
,
fscanf
,
vfprintf
表头文件
#include<stdio.h>
定义函数
int fprintf(FILE * stream, const char * format,.......);
函数说明
fprintf()
会根据参数
format
字符串来转换并格式化数据,然后将结果输出到
参数
stream
指定的
文件中,
直到出现字符串结束
('\0')
为止。
返回值
关于参数
format
字符串的格式请参考
printf()
。成功则返回实际输出的字符数,失败则返回
-1
,错误原因存于
errno
中。
范例
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
char a_buf[256], b_buf[256];
FILE *fp = NULL;
if(NULL == (fp = fopen("./tmp", "w+"))){
perror("fopen");
return(-1);
}
printf("input a string(<256):\n");
scanf("%s", a_buf);
fprintf(fp, "%s", a_buf);
// rewind(fp);
fseek(fp, 0, SEEK_SET); //
意义和
rewind(fp);
相同
fscanf(fp, "%s", b_buf);
printf("%s\n", b_buf);
fclose(fp);
return (0);
}
2.
fscanf
(格式化字符串输入)
相关函数
scanf
,
sscanf
表头文件
#include<stdio.h>
定义函数
int fscanf(FILE * stream ,const char *format,....);
函数说明
fscanf()
会自参数
stream
的文件流中
读取字符串,再根据参数
format
字符串来转换并格式化数据。
格式转换形式请参考
scanf()
。转换后的结构存于对应的参数内。
返回值
成功则返回参数数目,失败则返回
-1
,错误原因存于
errno
中。
附加说明
范例
#include<stdio.h>
3.
printf
(格式化输出数据)
相关函数
scanf
,
snprintf
表头文件
#include<stdio.h>
定义函数
int printf(const char * format,.............);
函数说明
printf()
会根据参数
format
字符串来转换并格式化数据,然后将结果写出到标准输出设备,直到出现字符串结束
('\0')
为止。参数
format
字符串可包含下列三种字符类型:
?
一般文本,伴随直接输出。
?
ASCII
控制字符,如
\t
、
\n
等。
?
格式转换字符。格式转换为一个百分比符号
(
%
)
及其后的格式字符所组成
。一般而言,每个%符号在其后都必需有一
printf()
的参数与之相呼应
(只有当%%转换字符出现时会直接输出%字符),而欲输出的数据类型必须与其相对应的转换字符类型相同。
Printf()
格式转换的一般形式如下:
%
(flags
)(width)(.prec)type //
以括号括起来的参数为选择性参数,而%与
type
则是必要的。
底下先介绍
type
的几种形式。
整数:
%
d
整数的参数会被转成一有符号的十进制数字
%
u
整数的参数会被转成一无符号的十进制数字
%
o
整数的参数会被转成一无符号的八进制数字
%
x
整数的参数会被转成一无符号的十六进制数字,并以小写
abcdef
表示
%
X
整数的参数会被转成一无符号的十六进制数字,并以大写
ABCDEF
表示
浮点型数:
%
f double
型的参数会被转成
十进制数字
,并取到小数点以下六位,四舍五入。
%
e double
型的参数以
指数形式
打印,有一个数字会在小数点前,六位数字在小数点后
,而在指数部分会以小写的
e
来表示。
%
E
与%
e
作用相同,唯一区别是指数部分将以大写的
E
来表示。
%
g double
型的参数会自动选择以%
f
或%
e
的格式来打印,其标准是根据欲打印的数值及所设置的有效位数来决定。
%
G
与%
g
作用相同,唯一区别在以指数形态打印时会选择%
E
格式。
字符及字符串:
%
c
整型数的参数会被转成
unsigned char
型打印出。
%
s
指向字符串的参数(指针)会被逐字输出,直到出现
NULL
字符为止
%
p
如果是参数是
“void *”
型指针则使用十六进制格式显示。
prec
有几种情况
?
正整数的最小位数。
?
在浮点型数中代表小数位数。
?
在%
g
格式代表有效位数的最大值。
?
在%
s
格式代表字符串的最大长度。
?
若为
*
符号则代表下个参数值为最大长度。
width
为参数的最小长度,若此栏并非数值,而是
*
符号,则表示以下一个参数当做参数长度。
flags
有下列几种情况:
?
+
一般在打印负数时,
printf
()会加印一个负号,整数则不加任何负号。此旗标会使得在打印正数前多一个正号(
+
)。
?
#
此旗标会根据其后转换字符的不同而有不同含义。当在类型为
o
之前(如%
#o
),则会在打印八进制数值前多印一个
o
。而在类型为
x
之前(%
#x
)则会在打印十六进制数前多印
’0x’
,在型态为
e
、
E
、
f
、
g
或
G
之前则会强迫数值打印小数点。在类型为
g
或
G
之前时则同时保留小数点及小数位数末尾的零。
?
0
当有指定参数时,无数字的参数将补上
0
。默认是关闭此旗标,所以一般会打印出空白字符。
返回值
成功则返回实际输出的字符数
,失败则返回
-1
,错误原因存于
errno
中。
范例
#include<stdio.h>
main()
{
int i = 150;
int j = -100;
double k = 3.14159;
printf(“%d %d %f\n”I, j, k);
printf(“%5d %*d\n”, i, 5, i); /*
参数
5
会代入格式
*
中,而与
%5d
同意义
*/
}
执行结果:
150 -100 3.141590
150 150
4.
sacnf
(格式化字符串输入)
相关函数
fscanf
,
snprintf
表头文件
#include <stdio.h>
定义函数
int scanf(const char * format,.......);
函数说明
scanf()
会将输入的数据根据参数
format
字符串来转换并格式化数据。
Scanf()
格式转换的一般形式如下:
%
[*]
[size]
[l]
[h]
type
以中括号括起来的参数为选择性参数,而%与
type
则是必要的。
选择性参数:
*
代表该对应的参数数据忽略不保存。
size
为允许参数输入的数据长度。
l
输入的数据数值以
long int
或
double
型保存。
h
输入的数据数值以
short int
型保存。
type
的几种形式:
%
d
输入的数据会被转成一有符号的十进制数字(
int
)。
%
i
输入的数据会被转成一有符号的十进制数字,若输入数据以
“
0x
”
或
“
0X
”
开头代表转换十六进制数字
,若以
“
0
”
开头则转换八进制数字,其他情况代表十进制
。
%
0
输入的数据会被转换成一无符号的八进制数字。
%
u
输入的数据会被转换成一无符号的正整数。
%
x
输入的数据为无符号的十六进制数字,转换后存于
unsigned int
型变量
。
%
X
同%
x
%
f
输入的数据为有符号的浮点型数,转换后存于
float
型变量
。
%
e
同%
f
%
E
同%
f
%
g
同%
f
%
s
输入数据为以空格字符为终止的字符串。
%
c
输入数据为单一字符。
[]
读取数据但只允许括号内的字符。如
[a-z]
。
[^]
读取数据但不允许中括号的
^
符号后的字符出现,如
[^0-9].
返回值
成功则返回参数数目
,失败则返回
-1
,错误原因存于
errno
中。
范例
#include <stdio.h>
main()
{
int i;
unsigned int j;
char s[5];
scanf(“%d %x %5[a-z] %*s %f”,&i,&j,s,s);
printf(“%d %d %s\n”, i, j, s);
}
执行
10 0x1b aaaaaaaaaa bbbbbbbbbb
10 27 aaaaa
5.
sprintf
(格式化字符串复制)
相关函数
printf
,
sprintf
表头文件
#include <stdio.h>
定义函数
int sprintf( char *str, const char * format,.........);
函数说明
sprintf()
会根据参数
format
字符串来转换并格式化数据,
然后将结果复制到参数
str
所指的字符串数组
,
直到出现字符串结束
(’\0’)
为止。
关于参数
format
字符串的格式请参考
printf()
。
返回值
成功则返回参数
str
字符串长度
,失败则返回
-1
,错误原因存于
errno
中。
附加说明
使用此函数得留意堆栈溢出,或改用
snprintf
()。
范例
#include<stdio.h>
main()
{
char * a = ”This is string A!”;
char buf[80];
sprintf(buf, ”>>> %s<<<\n”, a);
printf(“%s”, buf);
}
执行
>>>This is string A!<<<
6.
sscanf
(格式化字符串输入)
相关函数
scanf
,
fscanf
表头文件
#include <stdio.h>
定义函数
int sscanf (const char *str, const char * format,........);
函数说明
sscanf()
会将参数
str
的字符串根据参数
format
字符串来转换并格式化数据。
格式转换形式请参考
scanf()
。
转换后的结果存于
对应的参数内
。
返回值
成功则返回参数数目
,失败则返回
-1
,错误原因存于
errno
中。
范例
#include<stdio.h>
main()
{
int i;
unsigned int j;
char input[ ]=”10 0x1b aaaaaaaa bbbbbbbb”;
char s[5];
sscanf(input,”%d %x %5[a-z] %*s %f”,&i,&j,s,s);
printf(“%d %d %s\n”,i,j,s);
}
执行
10 27 aaaaa