问题描述
|
我想读取特定格式的文件,因此我使用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-%d\\n\",&axis,&minSpeed,&maxSpeed);
if (result != 3)
continue;
}
fclose(fp);
该文件的内容基于行,例如:
-;10000-20000
X;500-1000
S;2000-2400
有人可以帮我吗?
解决方法
显然,
fscanf_s()
需要在变量地址后加上一个大小参数
fscanf_s(fp,\"%c;%d-%d\\n\",&axis,1,&minSpeed,&maxSpeed);
/* extra 1 for the size of the ^^^ axis array */
但是我建议您不要使用*_s
函数:它们比普通命名的函数差---它们需要进行相同的检查,并在不使用它们时使您感到安全。我建议您不要使用它们,因为存在错误的安全感,并且它们在许多实现中都不可用,从而使您的程序只能在可能的有限机器中运行。
使用普通的fscanf()
fscanf(fp,&maxSpeed);
/* fscanf(fp,\"%1c;%d-%d\\n\",&maxSpeed); */
/* default 1 ^^^ same as for fscanf_s */
而且您对ѭ6的使用是错误的。
发生错误(文件结尾或匹配失败或读取错误...)时,ѭ7将返回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()失败。