C - Объединенный вывод на экран и текстовый файл - PullRequest
0 голосов
/ 02 мая 2019

Как мой проект проекта в школу, я написал простое приложение на C, которое вычисляет функциональное значение полинома, используя алгоритм Хорнера.Одним из запросов было распечатать вывод в текстовый файл.Я решил это с помощью некоторых простых функций цикла и fprintf.

Мой профессор хочет, чтобы я отредактировал его, чтобы объединить вывод на экран и в файл с помощью библиотеки stdarg.h.Я, вероятно, немного отсталый, потому что я пытался сделать это в течение трех дней безрезультатно.

Я прочитал большинство тем с похожей темой, пытался внедрить в него некоторые виды макросов, но я не был способен заставить его работать.Пожалуйста, помогите мне кто-нибудь, или я никогда не буду проходить этот класс самостоятельно.

Весь код ниже

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

#define OUT "./out.txt"

double horner(double * koe, int level, double x) {
  int i;
  for (i = level - 1; i >= 0; --i) {
    koe[i] += x * koe[i + 1]; //
  }
  return koe[0];
} //poly[0]x(n-1) + poly[1]x(n-2) + .. + poly[n-1]

int scanINT() {
  int number;
  while (1) {
    int LoadResult = scanf("%d", & number);
    fflush(stdin);

    if (LoadResult != 1) {
      printf("Value is not number.\n");
    } else {
      return number;
    }
  }
  return 0;
}

double ScanDouble() {
  double number;

  while (1) {
    int LoadResult = scanf("%lf", & number);
    fflush(stdin);

    if (LoadResult != 1) {
      printf("Value is not double.\n");
    } else {
      return number;
    }
  }
  return 0;
}

int ScanPositiveNumber() {
  while (1) {
    int number = scanINT();

    if (number < 0) {
      printf("Value is negative.\n");
    } else {
      return number;
    }
  }
  return 0;
}

int main(void) {
  int level, i;
  double x;
  double * koe;

  FILE * f = fopen(OUT, "w");
  if (f == NULL) {
    printf("Couldnt open file out.txt \n");
    exit(1);
  }

  while (1) {
    int option;

    printf("********************************\n");
    printf("Option 1: Functional value calc\n");
    printf("Option 2: Save result and end\n");
    printf("********************************\n\n");

    option = scanINT();

    if (option == 1) {
      printf("Insert level of polynom: ");
      level = ScanPositiveNumber();

      koe = (double * ) malloc((level + 1) * sizeof(double));
      if (koe == NULL) printf("Memory allocation failed.\n");
      for (i = level; i >= 0; --i) {
        printf("x^%d: ", i);
        koe[i] = ScanDouble();
      }

      printf("Insert point x: ");
      x = ScanDouble();

      double hornerVal = horner(koe, level, x);

      printf("f(%0.2f) = %0.2f\n", x, hornerVal);

      for (i = level; i >= 0; --i) {
        if (i != level) {
          if (koe[i] < 0) {
            fprintf(f, " ");
          } else {
            fprintf(f, " +");
          }
        }
        fprintf(f, "%0.2fx^%d", koe[i], i);
      }

      fprintf(f, "\nf(%0.2f) = %0.2f\n", x, hornerVal);
      free(koe);
    } else if (option == 2) {
      break;
    }
  }
  if (fclose(f) != 0) {
    printf("Couldnt save file out.txt \n");
  }

  return 0;
}

**/

1 Ответ

1 голос
/ 02 мая 2019

Я думаю, вы хотите что-то вроде этого

#include <stdarg.h>
#include <stdio.h>

#define OUT "./out.txt"

void printtwice(const char *fmt, ...) {
    va_list args;

    va_start(args, fmt);
    vprintf(fmt, args);
    va_end(args);

    va_start(args, fmt);
    FILE *h = fopen(OUT, "a"); // assume it worked
    vfprintf(h, fmt, args);
    fclose(h);
    va_end(args);
}

int main(void) {
    printtwice("%d-->%f\n", 42, 2.7182818);
}

См. Немного другой код , работающий на ideone

...