微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用fscanf_s时发生访问冲突

如何解决使用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()
需要在变量地址后加上一个大小参数
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()失败。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。