sscanf,sprintf,fscanf,fprintf 系列函数的用法小结

sscanf:
sscanf() - 从一个字符串中读进与指定格式相符的数据.
函数原型:
Int sscanf( string str, string fmt, mixed var1, mixed var2 ... );
int scanf( const char *format [,argument]... );
说明:
sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源。
其中的format可以是一个或多个 {%[*] [width] [{h | l | I64 | L}]type | ' ' | '\t' | '\n' | 非%符号}
注:
1、 * 亦可用于格式中, (即 %*d 和 %*s) 加了星号 (*) 表示跳过此数据不读入. (也就是不把此数据读入参数中)
2、{a|b|c}表示a,b,c中选一,[d],表示可以有d也可以没有d。
3、width表示读取宽度。
4、{h | l | I64 | L}:参数的size,通常h表示单字节size,I表示2字节 size,L表示4字节size(double例外),l64表示8字节size。
5、type :这就很多了,就是%s,%d之类。
6、特别的:%*[width] [{h | l | I64 | L}]type 表示满足该条件的被过滤掉,不会向目标参数中写入值
支持集合操作:
%[a-z] 表示匹配a到z中任意字符,贪婪性(尽可能多的匹配)
%[aB'] 匹配a、B、'中一员,贪婪性
%[^a] 匹配非a的任意字符,贪婪性
例子:
1. 常见用法。
char buf[512] = {0};
sscanf("123456 ", "%s", buf);
printf("%s\n", buf);
结果为:123456
2. 取指定长度的字符串。如在下例中,取最大长度为4字节的字符串。
sscanf("123456 ", "%4s", buf);
printf("%s\n", buf);
结果为:1234
3. 取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串。
sscanf("123456 abcdedf", "%[^ ]", buf);
printf("%s\n", buf);
结果为:123456
4. 取仅包含指定字符集的字符串。如在下例中,取仅包含1到9和小写字母的字符串。
sscanf("123456abcdedfBCDEF", "%[1-9a-z]", buf);
printf("%s\n", buf);
结果为:123456abcdedf
5. 取到指定字符集为止的字符串。如在下例中,取遇到大写字母为止的字符串。
sscanf("123456abcdedfBCDEF", "%[^A-Z]", buf);
printf("%s\n", buf);
结果为:123456abcdedf
6、给定一个字符串iios/12DDWDFF@122,获取 / 和 @ 之间的字符串,先将 "iios/"过滤掉,再将非'@'的一串内容送到buf中
sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", buf);
printf("%s\n", buf);
结果为:12DDWDFF
7、给定一个字符串““hello, world”,仅保留world。(注意:“,”之后有一空格)
sscanf(“hello, world”, "%*s%s", buf);
printf("%s\n", buf);
结果为:world
%*s表示第一个匹配到的%s被过滤掉,即hello被过滤了
如果没有空格则结果为NULL。

Sprintf:
sprintf 是个变参函数,定义如下:
int sprintf( char *buffer, const char *format [, argument] ... );
除了前两个参数类型固定外,后面可以接任意多个参数。而它的精华,显然就在第二个参数:
格式化字符串上。

fprintf():
  按格式输入到流,其原型是int fprintf(FILE *stream, const char *format[, argument, ...]);其用法和printf()相同,不过不是写到控制台,而是写到流罢了
例:fprintf(fp,"%2d%s",4,"Hahaha");

fscanf():
  从流中按格式读取,其原型是int fscanf(FILE *stream, const char *format[, address, ...]);其用法和scanf()相同,不过不是从控制台读取,而是从流读取罢了。
例:fscanf(fp,"%d%d" ,&x,&y);
<think>好的,我现在要帮用户理解C语言中的fscanffprintf函数。首先,我需要回顾一下这两个函数的基本用法,确保自己理解正确。根据用户提供的引用内容,fscanffprintf是用于文件读写的格式化函数,类似于scanf和printf,但操作对象是文件流。 接下来,我需要整理这些函数的语法和参数。比如,fprintf的语法是int fprintf(FILE *stream, const char *format, ...),而fscanf是int fscanf(FILE *stream, const char *format, ...)。它们的返回值都是成功读写的项数,这一点需要注意,用户可能会关心错误处理。 然后,用户可能需要具体的示例代码来理解如何在实际中使用这些函数。比如,如何用fprintf将数据写入文件,再用fscanf读取出来。这里需要确保示例代码正确,并且有注释说明每一步的作用。同时,引用中的示例显示可以操作结构体,所以最好包含结构体的例子,这样更全面。 用户提供的引用里提到,这两个函数也可以用于标准输入输出,比如用stdin和stdout作为流参数。这一点很重要,可能用户会有疑问,为什么要在这种情况下使用fscanffprintf而不是普通的scanf和printf。需要解释它们的灵活性,比如在需要统一处理输入输出流时可能有用。 另外,需要注意与其他类似函数的区别,比如sscanfsprintf,不过用户的问题主要集中在文件操作上,所以可能不需要深入这部分,但可以简要提及,以帮助用户区分不同函数的应用场景。 用户可能还会关心常见错误,比如文件打开失败时的处理,或者格式化字符串不匹配导致的读取问题。在示例代码中加入错误检查会更好,比如检查fopen是否返回NULL,以及fscanf的返回值是否与预期相符。 最后,生成的相关问题需要覆盖用户可能进一步想了解的内容,比如函数返回值的作用、与scanf/printf的区别、二进制文件处理等。确保问题有针对性,能够引导用户深入学习。 总结一下,回答的结构应该包括函数概述、语法、使用步骤、示例代码(结构体和标准流的情况)、注意事项以及相关问题。需要引用提供的资料来支持说明,确保信息的准确性。</think>### C语言fscanffprintf函数使用说明 #### 1. 函数概述 - **fprintf**:向指定文件流写入格式化数据,支持多种数据类型(如整数、浮点数、字符串等)[^2][^3]。 - **fscanf**:从指定文件流读取格式化数据,按指定格式解析内容[^2]。 #### 2. 函数语法 ```c int fprintf(FILE *stream, const char *format, ...); int fscanf(FILE *stream, const char *format, ...); ``` - `stream`:文件指针(如`stdout`表示标准输出,`stdin`表示标准输入) - `format`:格式化字符串(与`printf`/`scanf`规则相同) - 返回值:成功读写的项数,失败返回负数[^5] #### 3. 使用步骤 1. 打开文件:`FILE *fp = fopen("filename", "mode");` 2. 调用函数进行读写 3. 关闭文件:`fclose(fp);` #### 4. 示例代码 ##### 写入文件(结构体数据) ```c #include <stdio.h> struct Student { char name[20]; int age; float score; }; int main() { FILE *fp = fopen("data.txt", "w"); if (!fp) { perror("文件打开失败"); return -1; } struct Student s = {"张三", 18, 95.5}; fprintf(fp, "%s %d %.1f", s.name, s.age, s.score); // 写入格式化数据 fclose(fp); return 0; } ``` ##### 读取文件数据 ```c int main() { FILE *fp = fopen("data.txt", "r"); if (!fp) return -1; struct Student s; fscanf(fp, "%s %d %f", s.name, &s.age, &s.score); // 读取格式化数据 printf("姓名:%s\n年龄:%d\n分数:%.1f", s.name, s.age, s.score); fclose(fp); return 0; } ``` #### 5. 标准输入输出应用 ```c int a; fscanf(stdin, "%d", &a); // 等同于scanf fprintf(stdout, "%d", a); // 等同于printf ``` #### 6. 注意事项 - 格式化字符串需与数据类型严格匹配 - 文件打开模式需正确("w"为写,"r"为读,"a"为追加) - 读写结构体时建议使用二进制模式(`fwrite`/`fread`更高效)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值