天天看点

Clibrary | 【03】格式化输入/输出printf、scanf

文章目录

    • 1、fprintf
    • 2、fcanf
    • 3、printf
    • 4、scanf
    • 5、sprintf
    • 6、sscanf
    • 7、vfprintf

1、fprintf

int fprintf ( FILE * stream, const char * format, ... );

/*
* @func:将格式化的数据写入流;
* 		- 将格式指向的C字符串写入流。 若ormat包含(以%开头的子序列),则附加参数将被格式化插入到结果字符串中;
* @param stream:指向标识输出流的FILE对象的指针;
* @param format:要写入流的文本的C字符串,格式 - %[标记][[宽度][.精度][长度]说明符
* 		d/i - 有符号十进制整数;
* 		u - 无符号十进制整数;
* 		o - 无符号八进制;
* 		x - 无符号十六进制整数;
* 		X - 无符号十六进制整数(大写);
* 		f - 十进制浮点数,小写;
* 		F - 十进制浮点数,大写;
* 		e - 科学记数法(尾数/指数),小写;
* 		E - 科学记数法(尾数/指数),大写;
* 		g - 使用最短的表示:%e或%f;
* 		G - 使用最短的表示法:%E或%F;
* 		a - 十六进制浮点数,小写;
* 		A - 十六进制浮点数,大写;
* 		c - 特点;
* 		s - 字符串;
* 		p - 指针地址;
* 		n - 什么都没打印;
* 		% - 一个%后跟另一个%字符会将单个%写入流;
* 	标志:
* 		- :在给定的字段宽度内左对齐; 右对齐是默认值;
* 		+:对正数强制在结果前面加上一个正号或负号(+或-);
* 		spance:如果不写符号,则在值之前插入一个空格;
* 		#:与o, x或x指示符一起使用,对于不同于零的值,值前面分别有0,0x或0x;与a, a, e, e, f, f, g或g一起使用,它强制输出包含一个小数点
* 		0:当指定填充时,用0(0)左填充数字,而不是空格;
* 	宽度:
* 		(number):要打印的最小字符数。 如果要打印的值比这个数字短,结果将用空格填充。 即使结果更大,该值也不会被截断;
* 		*:宽度不是在格式字符串中指定的,而是作为必须格式化的参数前面的一个附加整数值参数。  
* 	精度:
* 		.number:有效位数;
* 		.*:精度不是在格式字符串中指定的,而是作为必须格式化的参数前面的一个附加整数值参数。
* return:成功返回字符总数,失败返回负数;
*/
           

案例

/*----------------------------------------------------------------------
	> File Name: stdioDemo.cpp
	> Author: Jxiepc
	> Mail: Jxiepc
	> Created Time: Mon 20 Sep 2021 04:20:08 PM CST
----------------------------------------------------------------------*/

#include<iostream>
#include<unistd.h>
#include<cstring>
#include<cstdio>

void myFprintf()
{
	char buf[1024];

	FILE* fp = fopen("file.txt", "w+");

     for (int i = 0; i<5; ++i){
         puts("请输入:");
         gets(buf);
		 fflush(stdin);
         fprintf(fp, "puts: 第%d个,输入[%-10.10s]\n ", i + 1, buf);

	}
	fclose(fp);
}
           

2、fcanf

int fscanf ( FILE * stream, const char * format, ... );

/*
* @func:从流中读取格式化数据;
* 		- 从流中读取数据并根据参数格式将它们存储到附加参数所指向的位置;
* @param stream:指向FILE对象的指针,该对象标识要从中读取数据的输入流;
* @param format:C 字符串,包含控制如何处理从流中提取的字符的字符序列
* 		- 空白字符:该函数将读取并忽略在下一个非空白字符之前遇到的任何空白字符;
* 		- 非空白字符,除了(%):任何不是空白(空格、换行符或制表符)或(以%字符开头)的一部分的字符都会导致函数读取下一个字符从流中,将其与此非空白字符进行比较,如果匹配,则将其丢弃,函数继续使用format的下一个字符。如果字符不匹配,则函数失败,返回并保留未读流的后续字符;
* 		- 格式说明符:由初始符号 ( % )形成的序列表示格式说明符,用于指定要从流中检索并存储到附加参数所指向的位置的数据的类型和格式。
* 		- 格式:%[*] [宽度] [长度]说明符
* 		
* 		u/i - 任意数目的数字,前面可选有符号(+或-);
* 		d - 任何数字的十进制数(0-9),前面可选有一个符号(+或-);
* 		o - 任何八进制数字(0-7),前面可选有符号(+或-);
* 		x - 十六进制;
* 		f,e,g,a - 一组小数;
* 		c - 字符;
* 		s - 任意数量的非空白字符,在找到的第一个空白字符处停止。 在存储序列的末尾自动添加一个终止空字符;
* 		p - 表示指针的字符序列; 
* 		[characters] - 在括号中指定的任意数量的字符;
* 		[^characters] - 括号中没有指定为字符的任意数量的字符;
* 		n - 不消耗输入,从远流读取的字符数存储在指定的位置;
* 		% - 一个%后跟另一个%字符会将单个%写入流;
* 	标志:
* 		- :在给定的字段宽度内左对齐; 右对齐是默认值;
* 		+:对正数强制在结果前面加上一个正号或负号(+或-);
* 		spance:如果不写符号,则在值之前插入一个空格;
* 		#:与o, x或x指示符一起使用,对于不同于零的值,值前面分别有0,0x或0x;与a, a, e, e, f, f, g或g一起使用,它强制输出包含一个小数点
* 		0:当指定填充时,用0(0)左填充数字,而不是空格;
* 	宽度:
* 		(number):要打印的最小字符数。 如果要打印的值比这个数字短,结果将用空格填充。 即使结果更大,该值也不会被截断;
* 		*:宽度不是在格式字符串中指定的,而是作为必须格式化的参数前面的一个附加整数值参数。  
* 	精度:
* 		.number:有效位数;
* 		.*:精度不是在格式字符串中指定的,而是作为必须格式化的参数前面的一个附加整数值参数。
* return:成功返回写入的字符总数,失败返回负数;
*/
           

案例

/*----------------------------------------------------------------------
	> File Name: stdioDemo.cpp
	> Author: Jxiepc
	> Mail: Jxiepc
	> Created Time: Mon 20 Sep 2021 04:20:08 PM CST
----------------------------------------------------------------------*/

#include<iostream>
#include<unistd.h>
#include<cstring>
#include<cstdio>

void myFscanf()
{
	char buf[1024];
	float f;
	int d;
	FILE * fp= fopen("file.txt", "w+");
	fprintf(fp, "%f %s %d", 3.14, "PI", 100);
	rewind(fp);
	fscanf(fp, "%f", &f);
	fscanf(fp, "%s", buf);
	fscanf(fp, "%d", &d);
	fclose(fp);
	printf("out:  %.2f %s %d \n",  f, buf, d);
}
           

3、printf

int printf ( const char * format, ... );

/*
* @func:将格式化的数据打印到标准输出;
* @param format:包含要写入标准输出的文本的C字符串;
* 		- 格式:%[flags][width][.precision][length]specifier;
* 		d/i - 有符号十进制整数;
* 		u - 无符号十进制整数;
* 		o - 无符号八进制;
* 		x - 无符号十六进制整数;
* 		X - 无符号十六进制整数(大写);
* 		f - 十进制浮点数,小写;
* 		F - 十进制浮点数,大写;
* 		e - 科学记数法(尾数/指数),小写;
*		E - 科学记数法(尾数/指数),大写;
* 		g - 使用最短的表示:%e或%f;
*		G - 使用最短的表示法:%E或%F;
* 		a - 十六进制浮点数,小写;
*		A - 十六进制浮点数,大写;
* 		c - 字符;
* 		s - 字符串;
* 		p - 指针地址;
* 		n - 什么都没打印;
* 		% -  一个%后跟另一个%字符会将单个%写入流。
*/
           

案例

printf ("Characters: %c %c \n", 'a', 65);
   printf ("Decimals: %d %ld\n", 1977, 650000L);
   printf ("Preceding with blanks: %10d \n", 1977);
   printf ("Preceding with zeros: %010d \n", 1977);
   printf ("Some different radices: %d %x %o %#x %#o \n", 100, 100, 100, 100, 100);
   printf ("floats: %4.2f %+.0e %E \n", 3.1416, 3.1416, 3.1416);
   printf ("Width trick: %*d \n", 5, 10);
   printf ("%s \n", "A string");

out:
	字符:a A
	十进制数:1977 650000
	前面有空格:1977
	前面有零:0000001977
	一些不同的基数:100 64 144 0x64 0144
	浮点数:3.14 +3e+000 1001
	字符串 A
	技巧:0000001977
           

4、scanf

int scanf ( const char * format, ... );
/*
* @func:从stdin读取格式化的数据;
* @param format:一系列字符的C字符串
* 		- 空白字符:该函数将读取并忽略在下一个非空白字符之前遇到的任何空白字符(空格、换行符和制表符)。 格式字符串中的单个空格将验证从流中提取的任意数量的空格字符(包括无空格字符)。  
*		- 非空白字符:格式说明符(%)除外: 比较这个非空字符,若匹配,它被丢弃和函数继续下一个字符的格式。 如果字符不匹配,函数将失败,返回流中的后续字符,并且不读取。  
*		- 格式说明符:由(%)组成的序列表示格式说明符,用于指定从流中检索并存储到附加参数所指向位置的数据的类型和格式。  
*		
*		- 格式:%[*][width][length]specifier
* 		i - 任意数量的数字,各个进制;
* 		u/d - 任意数目的数字,前面可选有符号(+或-),u表示无符号;
* 		o - 任何八进制数字(0-7),前面可选有符号(+或-);
* 		x - 十六进制;
* 		f,e,g,a - 一组小数;
* 		c - 字符,在末尾不添加空字符;
* 		s - 任意数量的非空白字符,在找到的第一个空白字符处停止。 在存储序列的末尾自动添加一个终止空字符;
* 		p - 表示指针的字符序列; 
* 		[characters] - 在括号中指定的任意数量的字符;
* 		[^characters] - 括号中没有指定为字符的任意数量的字符;
* 		n - 不消耗输入,从远流读取的字符数存储在指定的位置;
* 		% - 一个%后跟另一个%字符会将单个%写入流;
* 
* 		- 子说明符:
* 			* - 可选的起始星号表示数据将从流中读取但被忽略;
* 			width - 指定当前读取操作中要读取的最大字符数;
* 			length - hh, h, l, ll, j, z, t, L;
*  return:成功返回填充的参数列表的项目数,错误返回EOF;
*/
           

案例

char str[100];
int i;
scanf ("%79s",str);  
scanf ("%x",&i);
           

5、sprintf

int sprintf ( char * str, const char * format, ... );
/*
* @func:将格式化数据写入字符串;
* @param str:指向存储结果 C 字符串的缓冲区的指针;
* @param printf:C字符串包含遵循同样规格的格式字符串格式中的printf;
* return:成功返回写入的字符总数,失败返回负数。
*/
           

案例

/*----------------------------------------------------------------------
	> File Name: stdioDemo.cpp
	> Author: Jxiepc
	> Mail: Jxiepc
	> Created Time: Mon 20 Sep 2021 04:20:08 PM CST
----------------------------------------------------------------------*/

#include<iostream>
#include<unistd.h>
#include<cstring>
#include<cstdio>

void mySprintf(){
	char buf[1024];
	int num = 100;
	
	int n = sprintf(buf, "test %d ", num);
	printf("buf: %s, num:%d",buf, num);
}
           

6、sscanf

int sscanf ( const char * s, const char * format, ...);

/*
* @func:从字符串中读取格式化数据;
* @param s:函数将其处理为检索数据的源的 C 字符串;
* @param format:C字符串包含遵循同样规格的格式字符串格式中的scanf;
* return:成功返回参数列表中的项目数,失败EOF;
*/
           

案例

/*----------------------------------------------------------------------
	> File Name: stdioDemo.cpp
	> Author: Jxiepc
	> Mail: Jxiepc
	> Created Time: Mon 20 Sep 2021 04:20:08 PM CST
----------------------------------------------------------------------*/

#include<iostream>
#include<unistd.h>
#include<cstring>
#include<cstdio>

void mySscanf(){
	char buf[] = "I am the number 100012";
	char str[1024];
	int i;

	sscanf(buf, "%s %s %d", str, &i);

	printf("%s, %d\n", str, i);
} 
           

7、vfprintf

int vfprintf ( FILE * stream, const char * format, va_​​list arg);

/*
* @func:将变量参数列表中的格式化数据写入流;
* @param stream:指向标识输出流的FILE对象的指针;
* @param C字符串包含遵循同样规格的格式字符串格式中的printf;
* @param arg:标识用va_start初始化的变量参数列表的值。
* return:返回写入的字符总数,若错误返回负数;
*/
           

案例

/*----------------------------------------------------------------------
	> File Name: stdioDemo.cpp
	> Author: Jxiepc
	> Mail: Jxiepc
	> Created Time: Mon 20 Sep 2021 04:20:08 PM CST
----------------------------------------------------------------------*/

#include<iostream>
#include<unistd.h>
#include<cstring>
#include<cstdio>
#include<stdarg.h>

void comFormatter(FILE *stream, const char *format, ...){
	va_list args;
	va_start(args, format);
	vfprintf(stream, format, args);
	va_end(args);
	
}

void myVfprintf(){
	FILE *fp = fopen("file.txt", "w");
	comFormatter(fp, "test file.txt\n", 10);
	fclose(fp);
}
           

继续阅读