fscanf()没有像我期待的那样工作

时间:2012-10-13 20:22:35

标签: c

这是代码(位于函数内),用于打开文件,然后使用fscanf()读取其内容:

FILE *file = NULL;
int xTemp = 0, xTot = 0;
int yTemp = 0, yTot = 0;
int zTemp = 0, zTot = 0;
int i = 0;

file = fopen(nomeFile, "r");

if(file == NULL) {

    return 0;

} else {

    while(!feof(file)) {

        if(fscanf(file, "%f %f %f", &xTemp, &yTemp, &zTemp) != 3) {

            return -1;

        } else {

            i++;
            xTot += xTemp;
            yTot += yTemp;
            zTot += zTemp;

        }

    }

    coords.x = xTot/i;
    coords.y = yTot/i;
    coords.z = zTot/i;

    return i;

}

这是我正在使用fscanf()阅读的文件的内容:

3.5 2.1 -1.4
4.1 -4.1 2.9
2.6 2.5 3.2
-1.2 0.0 4.3
1.5 1.3 6.0

问题是fscanf()不会将xTempyTempzTemp分配给正确的值。

3 个答案:

答案 0 :(得分:1)

您的格式字符串指定了3个float值,但您将指针传递给int。您应该看到有关使用不同类型的编译器警告。

如果您想阅读float,请使用float变量来接收数据。

答案 1 :(得分:1)

使用float变量而不是int s。在fscanf中您使用的是%f,但变量是用于调用未定义行为的整数。

答案 2 :(得分:1)

您将变量声明为int

int xTemp = 0, xTot = 0;
int yTemp = 0, yTot = 0;
int zTemp = 0, zTot = 0;

但是将它们扫描为float s,因此这些值是float被解释为int的位表示(虽然它是未定义的行为,所以其他任何事情都可能发生)

此外,你的循环控制是错误的,

while(!feof(file)) {

    if(fscanf(file, "%f %f %f", &xTemp, &yTemp, &zTemp) != 3) {

        return -1;

    }

将始终返回-1。 {<1}}只有在尝试从文件末尾读取数据后才会变为,因此循环将在读取完最后一行后再次运行,然后{{1将不再读取三个值。

更好的循环控制将是

feof(file)