0

これは、ファイルを開き、その内容を次のように読み取るコード (関数内にあります) です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

4

3 に答える 3

1

変数を次のようintに宣言しました。

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

ただし、それらを s としてスキャンするfloatため、値はfloats として解釈された s のビット表現になりますint(ただし、これは未定義の動作であるため、他のことも起こる可能性があります)。

さらに、ループ制御が間違っています。

while(!feof(file)) {

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

        return -1;

    }

常に戻り-1ます。ファイルの終わりを過ぎてからデータを読み取ろうとしたfeof(file)にのみ true になるため、最後の行が読み取られた後にループが再び実行され、 3 つの値が読み取られなくなります。fscanf

より良いループ制御は

while(fscanf(file, "%f %f %f", &xTemp, &yTemp, &zTemp) == 3)
于 2012-10-13T20:27:25.300 に答える
1

フォーマット文字列は 3 つのfloat値を指定していますが、へのポインターを渡していますint。異なる型の使用に関するコンパイラの警告が表示されるはずです。

を読み取る場合は、変数をfloat使用してデータを受け取ります。float

于 2012-10-13T20:24:50.660 に答える
1

s の代わりに float 変数を使用しますintfscanf使用して%fいますが、変数は int であり、未定義の動作を呼び出します。

于 2012-10-13T20:25:26.797 に答える