我想读取特定格式的文件,所以我使用fscanf_s和while循环。但一旦处理了fscanf_s,程序就会因访问违规而崩溃(0xC0000005)。
这是代码:
FILE *fp;
errno_t err = fopen_s(&fp, "C:\data.txt", "r");
if (err != 0)
return 0;
int minSpeed = 0;
int maxSpeed = 0;
char axis = '@';
while(!feof(fp))
{
int result = fscanf_s(fp, "%c;%d-%dn", &axis, &minSpeed, &maxSpeed);
if (result != 3)
continue;
}
fclose(fp);
文件的内容是基于行的,例如:
-;10000-20000
X;500-1000
S;2000-2400
有人能帮我吗?
显然,fscanf_s()
在变量的地址之后需要一个大小参数
fscanf_s(fp, "%c;%d-%dn", &axis, 1, &minSpeed, &maxSpeed);
/* extra 1 for the size of the ^^^ axis array */
但我建议您不要使用*_s
函数:它们比简单命名的函数更糟糕——它们需要相同的检查,并且在不使用时会让您感到安全。我建议您不要使用它们,因为存在错误的安全感,而且它们在许多实现中都不可用,这使得您的程序只能在有限的可能机器子集中工作。
使用普通fscanf()
fscanf(fp, "%c;%d-%dn", &axis, &minSpeed, &maxSpeed);
/* fscanf(fp, "%1c;%d-%dn", &axis, &minSpeed, &maxSpeed); */
/* default 1 ^^^ same as for fscanf_s */
你对feof()
的使用是错误的
当出现错误(文件结束或匹配失败或读取错误…)时,fscanf()
返回EOF
您可以使用feof()
来确定fscanf()
失败的原因,而不是检查它在下次调用时是否会失败。
/* pseudo-code */
while (1) {
chk = fscanf();
if (chk == EOF) break;
if (chk < NUMBER_OF_EXPECTED_CONVERSIONS) {
/* ... conversion failures */
} else {
/* ... all ok */
}
}
if (feof()) /* failed because end-of-file reached */;
if (ferror()) /* failed because of stream error */;
如果您认为文件(data.txt)存在,那么您的应用程序运行时可能没有将当前目录设置为文件所在的位置。这将导致fopen_s()失败。