我想以特定格式读取文件,因此我使用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
有人能帮助我吗?
答案 0 :(得分:9)
显然,fscanf_s()
needs a size parameter after the address of the variable
fscanf_s(fp, "%c;%d-%d\n", &axis, 1, &minSpeed, &maxSpeed);
/* extra 1 for the size of the ^^^ axis array */
但是我建议你不要使用*_s
函数:它们比明确命名的函数更糟糕 - 它们需要相同的检查并让你感觉安全。我建议你不要使用它们,因为它们存在错误的安全感,并且它们在许多实现中都不可用,这使得你的程序只在有限的可能机器子集中工作。
使用plain fscanf()
fscanf(fp, "%c;%d-%d\n", &axis, &minSpeed, &maxSpeed);
/* fscanf(fp, "%1c;%d-%d\n", &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 */;
答案 1 :(得分:0)
如果您认为文件(data.txt)存在,则您的应用程序可能没有运行,当前目录设置为文件所在的位置。这会导致fopen_s()失败。