fscanf_s()使用

测试文件data.txt

1.0,3.14159

main.cpp

FILE *f = NULL;
int ret = fopen_s(&f, "./data.txt", "r");
if(ret) {
	return ret;
}
double val1 = 0, val2 = 0;
ret = fscanf_s(f, "%lf,%lf", &val1, &val2); // correct
// ret = fcanf_s(f, %lf,%lf", &val1, &val2, sizeof(double)); // correct
// ret = fcanf_s(f, %lf,%lf", &val1, sizeof(double), &val2, sizeof(double)); // false
if(ret) {
	fclose(f);
	return ret;
}
printf("val1: %lf, val2: %lf\n", val1, val2);
fclose(r)

对于fscanf_s()来说,只设置一个长度参数或者不指定长度参数,都可以通过,为每个数据都指定反而是错的,fscanf_s()不如fscanf()函数来的直接。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
c语言课程设计学生通讯录管理系统 LT 设计思路: 根据要求,电话录数据以文本文件存放在文件中,故需要提供文件的输入、输出等操作 ;还需要保存记录以进行修改,删除,查找等操作;另外还应提供键盘式选择菜单实现 功能选择。 图1 系统功能模块图 软件中使用的结构体和结构体数组,如: struct callmember { char name[20]; char address[20]; char code[20]; char callnumber[20]; }; 对用户的信息进行保存,他们都以二进制的形式读写。 其中: char name[20]; char address[20]; char code[20]; char callnumber[20] 分别对姓名、地址、邮编、电话号码进行储存 在子函数中还使用了结构体数组: struct callmember one[100]; 还使用了exit()、 fclose()等库函数。 还运用了头文件: #include "stdafx.h" #include"string.h " #include <stdio.h> #include<stdlib.h> 其中还使用大量的子函数,例如: void output(); void del(); void found(); void modify() ; void insert(); 部分子函数的详细代码: void output() { int b=0,i=0; int j; struct callmember one[100]; FILE *fp; if((fp=fopen("e:\\通讯录.txt","r"))==NULL) { printf("无法从已有通讯录输入!\n可能是因为原通讯录不存在或为空!\n建议你检查你 的通讯录文挡!\n"); exit(1); } while(fscanf(fp,"%s%s%s%s",one[i].name,one[i].address,one[i].code,one[i].cal lnumber)!=EOF) i++; j=i; for(i=0;i<j;i++) { printf("%s %s %s %s\n ",one[i].name,one[i].address,one[i].code,one[i].callnumber); } fclose(fp); } void insert() { FILE *fp; struct callmember *p; if((fp=fopen("e:\\通讯录.txt","a+"))==NULL) { printf("操作失败."); exit(1); } p=(struct callmember *)malloc(sizeof(struct callmember)); printf(" ************************\n"); printf(" 姓名:"); scanf("%s",p->name); printf(" 地址:"); scanf("%s",p->address); printf(" 邮编:"); scanf("%s",p->code); printf(" 电话:"); scanf("%s",p->callnumber); printf(" ************************\n"); fprintf(fp,"%s %s %s %s",p->name,p->address,p->code,p->callnumber); fclose(fp); free(p); } 通过对这些资源的合理利用使系统初步实现了通讯录管理系统的基本功能。 程序流程图: else printf("\n对不起,通讯录中没有此人的记录。"); fclose(fp); } 结果分析: 1运行进入程序主菜单 主选单具有所有函数的功能实现的选择功能,通过主选单的操作进入各个功能。主 选单主要由主函数提供,其功能由子函数实现。 2查看所有人员信息界面 可以显示全部的人员的信息。可在3 .3参看流程图。 3删除模块 删除功能界面 4查找模块 进入查找记录界面 5修改模块 进入修改界面 6添加模块 进入添加界面 可以根据要求添加用户想添加的人员信息。 7.退出 进入退出界面: 当出现没有查找人员信息时会自动返回主选单 总结 1本程序的局限性及改进方法: 本程序中包含的信息不够全面,比如年龄,性别,通讯地址,电子邮箱等,都没有包含 。改进方法就是在设计程序时把这些内容都加进去,电子邮箱还可以建立链接。 2运用本程序还可以编写比如对学生信息的管理系统,商店、超市里面对商品的管理,仓 库里面对货物的查询等等。 3在课程设计过程中遇到的问题,解决的办法 1、从文本
`fscanf_s` 是 C 标准库中的一个函数,用于从文件中读取格式化数据。`fscanf_s` 函数的原型如下: ```c int fscanf_s(FILE *stream, const char *format, ...); ``` 在 Visual Studio 中,为了增强安全性,Microsoft 引入了一组新的安全函数,其中就包括了 `fscanf_s` 函数。`fscanf_s` 函数的原型如下: ```c int fscanf_s(FILE *stream, const char *format, ...); int fscanf_s(FILE *stream, const char *format, va_list arglist); ``` 其中第二个版本支持可变参数列表。需要注意的是,`fscanf_s` 函数并不是标准 C 库函数,而是 Microsoft C 运行库中的扩展函数。因此,在使用时需要注意兼容性问题。 `fscanf_s` 函数与标准的 `fscanf` 函数类似,只不过在使用时需要多传递一个参数,即目标缓冲区的大小。这个参数用于防止缓冲区溢出。`fscanf_s` 函数的通用格式为: ```c fscanf_s(stream, format, [argument]...); ``` 其中,`stream` 表示输入流,`format` 表示格式控制字符串,`[argument]...` 表示可选的参数列表。在使用时需要根据具体的格式控制字符串和参数列表进行设置。下面是一个例子: ```c #include <stdio.h> int main() { int a, b; char str[10]; // 从标准输入流(stdin)中读取一个整数、一个字符串和另一个整数 fscanf_s(stdin, "%d %s %d", &a, str, 10, &b); printf("a = %d, b = %d, str = %s\n", a, b, str); return 0; } ``` 在上面的例子中,`fscanf_s` 函数从标准输入流(stdin)中读取一个整数、一个字符串和另一个整数。其中第二个参数 `%s` 是一个字符串格式控制字符串,用于读取一个字符串。第三个参数是目标缓冲区的大小,用于防止缓冲区溢出。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值