0

次の形式を含む行を含むテキスト ファイルを作成するように依頼されました。各タイプの情報 (またはフィールド) はスペースで区切る必要があり、各行は改行文字で終了する必要があります。

Category1 LabelA 0.32 10 0.60  8
Category1 LabelX 0.24 12 0.90  4
Category2 LabelZ 0.55 14 1.50  10

私はそれを読んで、ポインタを含む関数を使用して、各カテゴリの整数とすべてのカテゴリの合計計算を計算するように求められました。2 つの質問があります。

  • txt ファイルの各行を \n で終了する必要がありますか、それとも単純に (通常は入力するように) Enter キーを押すだけで十分ですか?
  • ファイルを変更したり開いたりせずに、ファイルから値を読み取って保存するにはどうすればよいですか? fgets と fscanf のどちらを使用するか混乱しています。
4

1 に答える 1

0

論理:

  • ループしながら!feof(FILE)
    1. fgets()1行
    2. sscanf()この線
    3. あなたの計算をしてください!

次のコードは、関数の呼び出しを減らすように最適化できますが、表現を明確にするために、複数の関数を作成しました..それぞれが 1 つのジョブのみを実行します。

#include <stdio.h>
#include <string.h>

void get_data(const char *ptr, char *category, char *label, float *f1,
          int *fint, float *f2, int *sint) //fint = first-int, sint is second int
{
  sscanf(ptr,"%s%s%f%d%f%d\n", category, label, f1, fint, f2, sint); 
}

const char *get_line(FILE *f, char *target, size_t size)
{
  fgets(target, size, f);
}

double random_calculation(float f1, int fint, float f2, int sint) 
{
  return f1 * fint + f2 * sint;
} 

int main(int argc, char *argv[])
{
  char buffer[512];
  char label[50], category[50];
  FILE *file;
  float f1, f2; 
  int fint,sint;
  double answer;
  if(argc != 2) { puts("No file!"); return 0;}
  file = fopen(argv[1], "r");//open in text mode
  if(!file) return;
  while(!feof(file)) {
    get_line(file, buffer, 511);
    puts(buffer);
    get_data(buffer, category, label,&f1,&fint, &f2, &sint);
    answer = random_calculation(f1, fint, f2, sint);
    printf(">>> %s %s: %lf\n\n", category, label, answer);
  }
  return 0;
}
于 2013-02-20T02:51:27.627 に答える