C,如何在用户每次输入后停止输出stdin?

时间:2015-04-29 03:18:07

标签: c file stdin eof

我是C的新手,我遇到了stdin的问题我无法找到解决方案。如果用户没有提供任何参数(文件),我的程序将从文件读取或从stdin读取。

如果用户没有提供任何参数,那么它将自动从stdin读取。我的程序应该接受输入(来自文件或标准输入),然后从中删除空行。

程序从stdin读取时出现问题。每次用户输入内容然后按下输入程序自动输出结果。当我更喜欢输入时只是换行。

  

如何让程序等待用户点击EOF而不是每次输入?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define NUMCHARS 1024

int main(int argc, char** argv){
  int good_file = 0;

  if (argc <= 1) {
    good_file++;
    test(stdin);
  }

  FILE* files[argc - 1];
  int i;
  for (i = 0; i < argc - 1; i++) {
    if ((files[i] = fopen(argv[i + 1], "r")) == NULL) {
      continue;
    } else {
      good_file++;
      test(files[i]);
    }
  }

  if (!good_file) {
    fprintf(stderr, "ERROR!\n");
  }
}

int test(FILE *file) {
  char buffer[NUMCHARS];

  while (fgets(buffer, NUMCHARS, file) != NULL)
    part2(buffer);
  fclose(file);
}

int part2(char *buffer) {
  if (!is_all_white(buffer)) {
    fputs(buffer, stdout);
  }
}

int is_all_white(char *s) {
  while (*s) {
    if (!('\n' == *s || '\t' == *s || ' ' == *s))
      return 0;
    s += 1;
  }
  return 1;
}

我感谢任何反馈!

2 个答案:

答案 0 :(得分:3)

stdin本身并不是问题 - 如果您想等待输出数据,则必须存储它。您可以将其写入文件并在之后将其读回。您可以使用mallocrealloc将数据存储在内存中。主要是,如果您不想在每一行输出数据,则无需在每一行输出数据。

答案 1 :(得分:-1)

预处理stdin到临时工作文件,这将为您提供所需的控件。 使用函数mkstemp。

警告stdin是一个管道,因为fopen文件可能是磁盘文件