gpt4 book ai didi

c - 使用 fscanf_s 时发生访问冲突

转载 作者:太空狗 更新时间:2023-10-29 15:20:39 25 4
gpt4 key购买 nike

我想读取一个特定格式的文件,所以我使用 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() 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 函数:它们比简单命名的函数更糟糕 --- 它们需要相同的检查,并且让您在不需要时感到安全。我建议您不要使用它们,因为错误的安全感以及它们在许多实现中不可用的事实使您的程序只能在可能的机器的有限子集中工作。

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

关于c - 使用 fscanf_s 时发生访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6153239/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com