C语言fscanf/fprintf函数(格式化读写文件)的用法(%[]和%n说明符)

[]基本用法

scanf() fscanf()函数,均从第一个非空格的可显示字符开始读起!

众所周之,scanf以空白字符为定界符,但如果输入的字符串是以其它字符为定界符的,那怎么办?

[ ] 就是专门处理这个问题的转换说明符。

[ ] 转换说明符可以通过两种方式产生结果字符集

  • 如果第一个 [ 字符右边没有抑扬符 ( ^ ) ,那么处于[ ]之间的字符就是结果字符集,不在其中的可输入字符都作为定界符;

  • 如果左边 [ 符号紧靠一个抑扬符 ( ^ ),那么意义相反,也就是 ^ 和 ] 之间的字符是定界符,其余可输入字符是结果字符集。

先来个小例子

%[^=]

上面这个例子里面定界符就是“ = ”,也就是只要不到 = 就不会停止。

下面来继续详解:

在使用 [ ] 说明符之前,得先明白两个概念:

一是扫描列表。扫描列表(scanlist)指的是包含在 [ 和 ] 两个字符之间除紧靠左边 [ 字符的抑扬符之外的字符,例如:

scanf("%[abcd]", ptr);

abcd组成扫描列表。

二是扫描字符集(scanset)。扫描字符集指的是结果字符集,例如上面的例子,结果字符集就是abcd。如果输入一个字符串“cbadkjf”,那么ptr得到的字符串是cbad,kjf三个字符都属于定界符,输入到k字符时输入字符串被截断,kjf三个字符被留在stdin里面。

如果带有抑扬符,例如:

scanf("%[^abcd]", ptr);

扫描列表仍然是abcd,但扫描字符集是除abcd外的可输入字符。如果输入字符串“jksferakjjdf”,ptr得到的字符串是“jksfer”。

如果想限制输入字符串的字符数量,可以象s说明符那样,在[]前面使用位域,例如:

scanf("%10[^abcd]", ptr);

这样结果字符串最多只能包含10个字符(除’/0’字符外)。

[]特殊用法

[ 符号可以作为扫描列表中的一个成员,但]字符除紧贴最左边的[字符或抑扬符两种情况外,其余情况下都不会被看作扫描列表的成员。例如“%[]abcd]”或者“%[^]abcd]”,上述两种情况下]字符属于扫描列表的成员,但如果是“%[ab]cd]”,中间的]字符不会被看作扫描列表的成员,而且输入输出的结果会是乱七八糟的。

对于减号-,只有在紧贴[字符或抑扬字符以及作为扫描列表最后一个成员时,-字符才会被视为扫描列表的成员。c标准把其余情况规定为编译器相关的。大多数编译器把这种情况的减号定义为连字符,例如:

scanf("%[a-zA-Z]", ptr);

那么扫描列表由大小写各26个字母组成。少数编译器仍旧把这种情况下的减号视为扫描列表成员。

fscanf(fd,"%*[^/n]/n");//%*是虚读,没有存,只是让指针跳过了这个变量!

%n用法

%n说明符输出有效字符数量,%n在scanf和printf中都可使用。与%n相对应的形参是一个int类型的指针,%n不影响scanf和printf的返回值。

例如:

scanf("%d %d%n", &i, &j, &k);

如果输入434 6434,则k等于8,而scanf的返回值仍然为2。

又如:

scanf("%c%n", &ch, &k);

输入“sbcdefdg”后,k等于1,而不是8,因为%c只取一个字符,%n输出的是有效字符数量。

%n用在printf函数里,表示输出的字符数量

例如:

printf("i=%d, j=%d/n%n", i, j, &k);

在i=343、j=123的情况下,k=12,同时%n不影响printf的返回值,其返回值仍然为12,而不是14。

fscanf() 和 fprintf() 函数

fscanf() 和 fprintf() 函数与前面使用的 scanf() 和 printf() 功能相似,都是格式化读写函数,两者的区别在于 fscanf() 和 fprintf() 的读写对象不是键盘和显示器,而是磁盘文件

这两个函数的原型为:

int fscanf ( FILE *fp, char * format, ... );
int fprintf ( FILE *fp, char * format, ... );

fp 为文件指针,format 为格式控制字符串,… 表示参数列表。与 scanf() 和 printf() 相比,它们仅仅多了一个 fp 参数。

例如:

FILE *fp;
int i, j;
char *str, ch;
fscanf(fp, "%d %s", &i, str);
fprintf(fp,"%d %c", j, ch);

fprintf() 返回成功写入的字符的个数,失败则返回负数。

fscanf() 返回参数列表中被成功赋值的参数个数。

简单示例

用 fscanf 和 fprintf 函数来完成对学生信息的读写。

#include<stdio.h>

#define N 2

struct stu{
    char name[10];
    int num;
    int age;
    float score;
} boya[N], boyb[N], *pa, *pb;

int main(){
    FILE *fp;
    int i;
    pa=boya;
    pb=boyb;
    if( (fp=fopen("D:\\demo.txt","wt+")) == NULL ){
        puts("Fail to open file!");
        exit(0);
    }

    //从键盘读入数据,保存到boya
    printf("Input data:\n");
    for(i=0; i<N; i++,pa++){
        scanf("%s %d %d %f", pa->name, &pa->num, &pa->age, &pa->score);   
    }
    pa = boya;
    //将boya中的数据写入到文件
    for(i=0; i<N; i++,pa++){
        fprintf(fp,"%s %d %d %f\n", pa->name, pa->num, pa->age, pa->score);   
    }
    //重置文件指针
    rewind(fp);
    //从文件中读取数据,保存到boyb
    for(i=0; i<N; i++,pb++){
        fscanf(fp, "%s %d %d %f\n", pb->name, &pb->num, &pb->age, &pb->score);
    }
    pb=boyb;
    //将boyb中的数据输出到显示器
    for(i=0; i<N; i++,pb++){
        printf("%s  %d  %d  %f\n", pb->name, pb->num, pb->age, pb->score);
    }

    fclose(fp);
    return 0;
}

运行结果:

Input data:
Tom 2 15 90.5
Hua 1 14 99
Tom  2  15  90.500000
Hua  1  14  99.000000

打开 D:\demo.txt,发现文件的内容是可以阅读的,格式非常清晰。用 fprintf() 和 fscanf() 函数读写配置文件、日志文件会非常方便,不但程序能够识别,用户也可以看懂,可以手动修改。

如果将 fp 设置为 stdin,那么 fscanf() 函数将会从键盘读取数据,与 scanf 的作用相同;设置为 stdout,那么 fprintf() 函数将会向显示器输出内容,与 printf 的作用相同。

例如:

#include<stdio.h>
int main(){
    int a, b, sum;
    fprintf(stdout, "Input two numbers: ");
    fscanf(stdin, "%d %d", &a, &b);
    sum = a + b;
    fprintf(stdout, "sum=%d\n", sum);
    return 0;
}

运行结果:

Input two numbers: 10 20
sum=30
  • 9
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
C语言fscanf函数用于从输入流读取格式化数据。它的基本语法是: int fscanf(FILE *stream, const char *format, ...); 其,stream是指向输入流的指针,format是格式字符串,...表示可变参数列表,用于接收读取的数据。 fscanf函数根据format字符串的格式指定符,从输入流读取数据,并将其存储到对应的变量。例如,"%d"表示读取一个整数,"%f"表示读取一个浮点数,"%s"表示读取一个字符串。 下面是一个示例程序,演示了fscanf用法: ```c #include <stdio.h> int main() { FILE *fp = fopen("input.txt", "r"); int a; float b; char arr\[10\]; fscanf(fp, "%d %f %s", &a, &b, arr); printf("a=%d, b=%f, arr=%s\n", a, b, arr); fclose(fp); return 0; } ``` 在这个示例,我们打开了一个名为"input.txt"的文件,并从读取一个整数、一个浮点数和一个字符串,然后将它们打印到屏幕上。 请注意,fscanf函数会根据格式字符串的格式指定符来确定读取的数据类型,并将其转换为对应的变量类型。同时,我们需要使用取地址符"&"来传递变量的地址,以便fscanf函数可以将读取的数据存储到正确的位置。 希望这个例子能够帮助你理解fscanf函数用法。如果还有其他问题,请随时提问。 #### 引用[.reference_title] - *1* *2* [C语言fscanf和fprintf函数的使用](https://blog.csdn.net/cuoguodeshiyihan/article/details/126398888)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [C语言基础-fscanf函数使用示例](https://blog.csdn.net/baidu_35692628/article/details/73469842)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值