使用fscanf_s时访问冲突

我想以特定格式读取文件,因此我使用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()在变量的地址后面需要一个size参数

 fscanf_s(fp, "%c;%d-%d\n", &axis, 1, &minSpeed, &maxSpeed); /* extra 1 for the size of the ^^^ axis array */ 

但我建议你不要使用*_s函数:它们比明确命名的函数更糟糕 – 它们需要相同的检查,并且当你不是时,它会让你感到安全。 我建议你不要使用它们,因为它们存在错误的安全感,并且它们在许多实现中都不可用,这使得你的程序只在有限的可能机器子集中工作。

使用普通的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 */; 

如果您认为文件(data.txt)存在,则您的应用程序可能无法运行,并且当前目录设置为文件所在的位置。 这会导致fopen_s()失败。