ARM技术论坛
直播中

嵌入式小能手

2年用户 1511经验值
擅长:嵌入式技术
私信 关注
[经验]

飞凌嵌入式ElfBoard-标准IO接口之格式化输入

格式化输入用于从不同输入源中获取数据并根据格式化字符串format转换为对应的格式代码并存储在对应的类型中。
格式化输入函数:即按特定的格式从特定位置上把数据输入到特定的位置之中。
1.scanf
用于从标准输入流stdin读取格式化数据,并根据参数格式将其存储到附加参数所指向的位置。       
1)头文件
#include
2)函数原型
int scanf ( const char * format, ... );
3)参数
format:表示格式化字符串,用于指定输入数据如何进行格式转换,有如下三种情况。
空格字符:函数将读取并忽略在下一个非空格字符之前遇到的任何空格字符(空格字符包括空格、换行符和制表符)
非空格字符,格式说明符除外(%):任何不是空格字符(空白、换行符或制表符)或格式说明符(以%字符开头)的字符都会导致函数从流中读取下一个字符,将其与此非空格字符进行比较,如果匹配,则将其丢弃,函数继续使用格式的下一个字符。如果字符不匹配,则函数将失败,返回流的后续字符并使其处于未读状态。
格式说明符:由%组成的序列表示格式说明符,该说明符用于指定要从流中检索并存储到附加参数所指向的位置的数据的类型和格式。
...:表示附加可变参数,根据不同的 format 字符串,函数可能需要一系列的附加参数,每个参数包含了一个要被插入的值,替换了 format 参数中指定的每个 % 标签。参数的个数应与 % 标签的个数相同。
4)返回值
如果成功,返回成功读入的数据数量;读入数据时遇到了“文件结束(例如ctrl+d)”则返回EOF(-1)。
5)示例:(通过scanf获取按键输入信息)
#include
int main()
{
        int a = 0, d = 0;
        char b, c[10];
        int count = scanf("%d %ca%s %d", &a, &b, c, &d);
//此处四个输入,以此测试空格字符' '、非空格字符‘a’、格式说明符'%d''%s''%c'
        printf("\nscanf=%d,a=%d,b=%c,c=%s\n", count, a, b, c);
        return 0;
}
6)编译运行并查看测试结果
123        //此处输入123并回车
bac123     //此处输入bac123并回车
           //此处使用crtl+d退出
scanf=3,a=123,b=b,c=c123   //由于文件结束,scanf只读入3个数据,非空格字符‘a’被正确识别,因此bac123被识别为输入b和输入c
2.fscanf
从FILE指针指定的文件中读取格式化数据。
1)头文件
#include
2)函数原型
int fscanf(FILE *stream, const char *format, ...);
3)参数
stream:要读取的文件。
format:表示格式控制字符串,用于指定输入数据如何进行格式转换,有如下三种情况。
空格字符:函数将读取并忽略在下一个非空格字符之前遇到的任何空格字符(空格字符包括空格、换行符和制表符)
非空格字符,格式说明符除外(%):任何不是空格字符(空白、换行符或制表符)或格式说明符(以%字符开头)的字符都会导致函数从流中读取下一个字符,将其与此非空格字符进行比较,如果匹配,则将其丢弃,函数继续使用格式的下一个字符。如果字符不匹配,则函数将失败,返回流的后续字符并使其处于未读状态。
格式说明符:由%组成的序列表示格式说明符,该说明符用于指定要从流中检索并存储到附加参数所指向的位置的数据的类型和格式。
...:表示附加可变参数,根据不同的 format 字符串,函数可能需要一系列的附加参数,每个参数包含了一个要被插入的值,替换了 format 参数中指定的每个 % 标签。参数的个数应与 % 标签的个数相同。
4)返回值
如果成功,返回成功读入的数据数量;读入数据时遇到了“文件结束(例如ctrl+d)”则返回EOF(-1)。
5)示例:(通过fscanf获取特定文件内容)
#include
int main()
{
        int a = 0, count = 0;
        char b[10], c[10];
        FILE *fp = fopen("ftest", "w+");
        if (!fp) {
                fprintf(stderr, "ftest2 err\n");
                return -1;
        }
        fprintf(fp,"%d %s %s\n", 123, "fprintf", "test");   //向ftest文件写入特定内容
        rewind(fp);                //将位置指针移动到开头,以便读取内容
        count = fscanf(fp,"%d %s %s", &a, b, c);
        printf("fscanf=%d,a=%d,b=%s,c=%s\n", count, a, b, c);
        fclose(fp);
        return 0;
}
6)编译运行并查看测试结果
fscanf=3,a=123,b=fprintf,c=test
$ cat ftest                //cat查看ftest内容看是否与fscanf获取一致
123 fprintf test
3.sscanf
用于从特定缓冲区中读取格式化数据。
1)头文件
#include
2)函数原型
int sscanf(const char *str, const char *format, ...);
3)参数
str:表示存储数据的缓冲区。
format:表示格式控制字符串,用于指定输入数据如何进行格式转换,有如下三种情况。
空格字符:函数将读取并忽略在下一个非空格字符之前遇到的任何空格字符(空格字符包括空格、换行符和制表符)
非空格字符,格式说明符除外(%):任何不是空格字符(空白、换行符或制表符)或格式说明符(以%字符开头)的字符都会导致函数从流中读取下一个字符,将其与此非空格字符进行比较,如果匹配,则将其丢弃,函数继续使用格式的下一个字符。如果字符不匹配,则函数将失败,返回流的后续字符并使其处于未读状态。
格式说明符:由%组成的序列表示格式说明符,该说明符用于指定要从流中检索并存储到附加参数所指向的位置的数据的类型和格式。
...:表示附加可变参数,根据不同的 format 字符串,函数可能需要一系列的附加参数,每个参数包含了一个要被插入的值,替换了 format 参数中指定的每个 % 标签。参数的个数应与 % 标签的个数相同。
4)返回值
如果成功,返回成功读入的数据数量;读入数据时遇到了“文件结束(例如ctrl+d)”则返回EOF(-1)。
5)示例:(通过sscanf获取缓冲区内容)
#include
int main()
{
        char *a = "abc 123";
        char buf[10];
        int b;
        int count = sscanf(a,"%s %d", buf, &b);
        printf("scanf=%d buf= %s b=%d\n", count, buf, b);
        return 0;
}
6)编译运行并查看测试结果
scanf=2 buf= abc b=123

更多回帖

发帖
×
20
完善资料,
赚取积分