C-统一输出到屏幕和文本文件

时间:2019-05-02 13:15:53

标签: c codeblocks

作为我上学期的项目,我编写了一个简单的C应用程序,该应用程序使用Horner算法计算多项式的函数值。 要求之一是将输出打印到txt文件。我通过一些简单的循环和fprintf函数解决了它。

我的教授希望我对其进行编辑,以通过使用stdarg.h库将输出合并到屏幕和文件中。我大概是个弱智者,因为我已经尝试了三天了,没有任何结果。

我已经阅读了大多数主题相似的主题,试图在其中实现一些tee宏,但是我没有能力使其工作。 请帮助我,否则我将永远不会独自通过这门课。

下面的整个代码

#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 个答案:

答案 0 :(得分:1)

我想你想要这样的东西

#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);
}

查看略有不同的代码running on ideone