引自免费微信小程序:皆我百晓生
在C语言中使用结构体读取文件时,您遇到了问题。根据您提供的代码片段,您尝试以格式化的方式从文件中读取数据到结构体S
的成员变量中。然而,fscanf_s
函数对于字符数组(字符串)读取需要额外的安全参数,用来指定缓冲区大小以防止溢出。请参阅以下修正后的代码:
#include<stdio.h>
#include <string.h>
struct S
{
char arr[10];
int age;
float score;
};
int main()
{
struct S s = {0};
FILE* pf;
errno_t err = fopen_s(&pf, "C:\\C语言\\test_24_3_6\\test.txt", "r");
// 为fscanf_s提供缓冲区大小以安全读取字符串
if (pf != NULL)
{
fscanf_s(pf, "%9s %d %f", s.arr, _countof(s.arr), &(s.age), &(s.score));
printf("%s %d %f\n", s.arr, s.age, s.score);
fclose(pf);
}
else
{
perror("Failed to open file");
}
return 0;
}
上述代码中,我已将fscanf_s
调用进行了调整,给字符数组s.arr
添加了缓冲区大小参数_countof(s.arr)
。这样可以确保在读取字符串时不会超出数组容量,从而避免潜在的安全风险。
另外,我还增加了对打开文件失败情况的处理,如果fopen_s
返回非零值,则会输出错误信息。这样有助于调试和了解程序运行过程中可能遇到的问题。请注意,您的文本文件内容应与结构体成员变量匹配,即文件中应该是一个不超过9个字符的字符串、一个整数和一个小数,各部分之间以空格分隔。