C, как остановить вывод stdin после каждого ввода пользователем?

Я новичок в C, и у меня возникла проблема со стандартным вводом, которую я не могу найти. Моя программа либо читает из файла (ов), либо читает из стандартного ввода, если пользователь не предоставил аргументы (файлы).

Если пользователь не предоставит никаких аргументов, он будет автоматически читать из стандартного ввода. Моя программа должна принимать ввод (из файла или стандартного ввода), а затем удалять из него пустые строки.

Моя проблема возникает, когда программа читает из стандартного ввода. Каждый раз, когда пользователь что-то набирает, затем нажимает, программа автоматически выводит результаты. Когда я бы предпочел, чтобы ввод был просто новой строкой.

Как я могу сделать так, чтобы программа ждала, пока пользователь нажимает 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;
}

Я ценю любые отзывы!


person collinskewl2    schedule 29.04.2015    source источник
comment
Я бы не рекомендовал его для этого проекта, но если вам действительно нужен этот элемент управления, см. man 3 tcsetattr и посмотрите на режим Raw, в котором вы можете отключить отображение ввода в терминал.   -  person David C. Rankin    schedule 29.04.2015


Ответы (2)


Само по себе это не проблема stdin - если вы хотите подождать вывода данных, вам придется их сохранить. Вы можете записать его в файл и потом прочитать обратно. Вы можете использовать malloc и realloc для хранения данных в памяти. В основном, если вы не хотите, чтобы данные выводились на каждой строке, вам не нужно выводить их на каждой строке.

person Politank-Z    schedule 29.04.2015

Предварительно обработайте stdin во временный рабочий файл, это даст вам необходимый контроль. Используйте функцию mkstemp.

Имейте в виду, что stdin - это канал, где, поскольку файлы fopen, вероятно, являются файлами диска

person phil    schedule 29.04.2015
comment
Это не мой голос против, но комментарий о том, что stdin - это трубка, в целом неверен. Это может быть файл (./program < file), терминал (./program) или конвейер (echo Hi | ./program), чтобы охватить только основы. Вы слишком обобщили этот комментарий. - person Jonathan Leffler; 29.04.2015