2

---これは宿題の質問です---

fscanf を使用してテキスト ファイルから float 値を読み取る際に問題が発生しています。

基本的に、ファイルから float 値を読み取り、それらを動的配列に格納しようとしています。入力ファイルには、1 行に 2 つの float があります。したがって、行は「0.85 7.34」(引用符なし)の場合があります。だから私は fscanf(fp, "%f %f", &coordinates[i], &coordinates[i++]) を使用して2つの浮動小数点値を読み取ろうとしています。印刷すると0.00000と表示されます。以下は、私が書いたコードとそれが生成する出力です。

#include <stdio.h>
#include <stdlib.h>

int main (int argc, char *argv []) {

FILE * fp = fopen("nums", "r");

float *coordinates;
float *tmp;
int i = 0;
int ARRAY_SIZE = 5;
coordinates = malloc(5*sizeof(float));

while (fscanf(fp,"%f %f", &coordinates[i], &coordinates[i++]) > 1)
{

  printf("iteration# %d | coord1 = %f coord2 = %f \n", i, &coordinates[i-1], &coordinates[i]);

  if (i >= ARRAY_SIZE)
  {
    tmp = realloc(coordinates, (i*2)*sizeof(float));
    coordinates = tmp;
    ARRAY_SIZE = i*2;
  }
  i++;
}

for(i = 0; i < 8; i++)
  printf("%f\n", &coordinates[i]);


return 0;
}

出力:

iteration# 1 | coord1 = 0.000000 coord2 = 0.000000 
iteration# 3 | coord1 = 0.000000 coord2 = 0.000000 
iteration# 5 | coord1 = 0.000000 coord2 = 0.000000 
iteration# 7 | coord1 = 0.000000 coord2 = 0.000000 
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000  
4

2 に答える 2

2

&「のアドレス」-演算子を。とともに使用しないでprintfください。 fscanfprintfは変更しないのに対し、変数値を変更できることを認識できるように、データへのポインターが必要です。

変化する:

printf("iteration# %d | coord1 = %f coord2 = %f \n", i, &coordinates[i-1], &coordinates[i]);

に:

printf("iteration# %d | coord1 = %f coord2 = %f \n", i, coordinates[i-1], coordinates[i]);
于 2013-01-31T04:21:30.013 に答える
0

最初の問題:

 while (fscanf(fp,"%f %f", &coordinates[i], &coordinates[i++]) > 1)

in の値を使用して、介在するシーケンス ポイントなしでiin&coordinates[i]に変更しようとしています。&coordinates[i++]その際の動作はundefinedであり、ほとんどの場合、希望どおりに動作しません。&coordinates[i+1]2 番目の引数に使用します。これは、または同様iのループで更新する必要があることを意味することに注意してください。が の前に評価されるとは限らないi += 2ことに注意してください。&coordinates[i]&coordinates[i++]

2番目の問題:

printf("%f\n", &coordinates[i]);

繰り返しますが、未定義の動作を呼び出しました。printftype の値を期待するように言いましたが、 typefloatの値を渡していますfloat *。を失う&。 この点で対称的ではありません scanfprintf

ヘッドスクラッチャー:

1 行に 2 つの値があることはわかっていますが、配列サイズを (4、6、8 ではなく) 5 から開始します。配列のサイズを変更することはできますが (正確に追加するかもしれません)、読み取った項目の実際の数を使用するのではなく、印刷ループのサイズを 8 にハードコードしました。

于 2013-01-31T04:35:21.083 に答える