0

ファイルから浮動小数点数の入力を取り、それを配列に配置しようとしています。

唯一の問題は、浮動小数点数の最大数が 1000 であることはわかっていますが、毎回浮動小数点数がいくつになるか正確にはわからないことです。

私がする必要があるのは、fscanf にすべての浮動小数点数を取得させてから、整数でいっぱいの次の行で停止させることです。

このセクションのこれまでの内容は次のとおりです。

for (repetition = 0; repetition <= 1000; repetition++)
{ 

    fscanf(userFile, "%f", &itemPrice[itemNumber]);
    itemNumber++;

}

しかし残念なことに、これは次の数行で配列値を他のすべての値に代入し続けます。

別のユーザー入力を見つけ、auctionItemsそれを使用して配列の長さを制御しましたwhile(itemNumber < auctionItems)

4

4 に答える 4

0

の戻り値fscanfは、正常に読み取られたアイテムの数です。それを使用して、いつ停止するかを決定します。

#include <stdio.h>

int main(int argc,char * argv[])
{
  int i;
  float ff[1000];
  char next_text[17];

  for (i=0; i < 1000; i++) {
    int n_read;

    n_read = fscanf(stdin, " %f", &( ff[i] ));
    if (n_read < 1) {
      fscanf(stdin, "%16s", next_text);
      next_text[16] = (char) 0;
      printf("Next text: '%s'\n", next_text);
      break;
    }
  }

  printf("Read %d items, %f .. %f\n",i,ff[0],ff[i-1]);
  return 0;
}
于 2014-09-16T00:30:04.297 に答える
0

fgetc と fputc を使用して、この方法を試すことができるかもしれません。

for (repetition = 0; itemPrice <= 1000; repetition++)
{
    int c = fgetc(userFile);
    if (c == '\n' || c == EOF) break;
    fputc(c);


    fscanf(userFile, "%f", &itemPrice[itemNumber]);
    itemNumber++;

}
于 2014-09-16T00:32:35.013 に答える
0

OPはかなり近いです。スキャンに失敗したら停止します。

fscanf()スキャンされたフィールドの数または を返しますEOF。この場合、チェックする1だけで十分です。

// for (repetition = 0; itemPrice <= 1000; repetition++)  Use <, not <= @Arpit
for (i = 0; i < 1000; )
{ 
    int retval = fscanf(userFile, "%f", &itemPrice[i]);
    if (retval != 1) break;
    i++;
}

堅牢なソリューションは、予期しないデータを検出します。このソリューションは、ファイルの終わりまたは非浮動テキストが検出されるまで単純に続きます。


[編集] OP にはfloats が 1 行しかないようです。その場合、コードは行全体を読み取ってからバッファを解析できます。

#define CHAR_PER_FLOAT_MAX  20
char buf[1000*(CHAR_PER_FLOAT_MAX + 1)];  // Some large buffer
if (fgets(buf, sizeof buf, input)== NULL) return;  // EOF or IO error

char *p = buf;
for (i = 0; i < 1000; ) { 
    int n = 0;
    if (sscanf(p, "%f %n", &itemPrice[i], &n) != 1) break;
    p += n;
    i++;
}   
if (*p) Handle_ExtraTextOnLine();

foo(itemPrice, i); // Use data

もう 1 つの方法は、ファイルから一度に 1 つずつ直接読み取りfloat、次の行末の空白を調べることです。エレガントではありません。

for (i = 0; i < 1000; ) { 
    if (fscanf(input, "%f", &itemPrice[i]) != 1) {
      // need to add code to consume the rest of the line if processing is to continue.
      break;
      }
    i++;

    // look for standard white-space
    char buf[2];
    while (fscanf(input, "%1[ \f\n\r\t\v]", buf) == 1) {
      if (buf[0] == '\n') break;
    }
}   
foo(itemPrice, i); // Use data
于 2014-09-16T00:56:08.847 に答える
0
char input[MAX];
while(fgets(input, MAX, userFile) != NULL){
    sscanf(input, "%lf", &itemPrice[itemNumber++]);
}
于 2014-09-16T01:18:58.890 に答える