【问题标题】:C, how to stop stdin from outputting after each enter by the user?C、用户每次输入后如何停止stdin输出?
【发布时间】:2015-07-08 03:32:45
【问题描述】:

我是 C 新手,我遇到了 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;
}

感谢任何反馈!

【问题讨论】:

  • 我不会在这个项目中推荐它,但如果你真的想要那个控件,请参阅man 3 tcsetattr 并查看 Raw 模式,你可以在其中禁用回显输入到终端。

标签: c file stdin eof


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    将标准输入预处理到临时工作文件中,这将为您提供所需的控制。 使用函数 mkstemp。

    注意标准输入是一个管道,而 fopen 文件可能是磁盘文件

    【讨论】:

    • 不是我的反对票,但关于“标准输入是管道”的评论通常是不正确的。它可以是文件 (./program &lt; file) 或终端 (./program) 或管道 (echo Hi | ./program),仅涵盖基础知识。您对那条评论过于笼统了。
    猜你喜欢
    • 1970-01-01
    • 2018-10-28
    • 2022-06-17
    • 2016-04-29
    • 2022-12-09
    • 2015-11-30
    • 1970-01-01
    • 2023-01-12
    • 1970-01-01
    相关资源
    最近更新 更多