使用fscanf_s时访问冲突

时间:2011-05-27 13:56:34

标签: c scanf

我想以特定格式读取文件,因此我使用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

有人能帮助我吗?

2 个答案:

答案 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()失败。