Нужно ли мне менять стандартный ввод, если я сначала использую «имя файла» в качестве стандартного ввода, а затем мне нужно вернуться к традиционному консольному стандартному вводу?

./набор данных ‹ имя файла

// Читаю данные в файл и сохраняю в массивы...

...

// Здесь мне нужно запросить у пользователя число, однако программа всегда пропускает пользовательский ввод и продолжает...

символьный ответ; ответ = получить символ(); // Всегда пропускайте getchar()


person user3366297    schedule 03.03.2014    source источник


Ответы (2)


Нет, это не способ сделать это. Не знаю, сработает ли это, но не будет ли намного проще просто открыть файл, прочитать его и зарезервировать стандартный ввод для вашего взаимодействия с пользователем?

FILE *yourinputfile;

yourinputfile=fopen("whatevernamethefilehas","r");
// read with the appropriate routines, eg fscanf

fclose (yourinputfile);

char answer; answer = getchar(); // won't skip now

Вы заметите, что у всех подпрограмм ввода в C есть «сокращенная» разновидность, которая читает стандартный ввод, и разновидность, начинающаяся с f, которая читает файл.

  • сканф и фсканф
  • получает и трахается
  • так далее

Справочные страницы — ваш друг :)

person fvu    schedule 03.03.2014
comment
Да, это было бы проще, но учителям нравится все усложнять... Я понял то, что вы предложили, я просто не могу сделать это так... Мне нужно перенаправить файл следующим образом ./dataset ‹ имя файла, а затем получить пользовательский ввод... - person user3366297; 04.03.2014
comment
Здесь на SO есть пара связанных вопросов, например stackoverflow.com/questions/584868/ может быть, это поможет? Тем не менее, не думаю, что это хорошая идея, но если это то, чего хочет проф, то у вас нет особого выбора... - person fvu; 04.03.2014

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

Рад вдаваться в подробности, если это кажется правильной деталью направления

Изменить. Можете ли вы поделиться тем, как вы «остановили» чтение с традиционного стандартного ввода? Я в замешательстве, потому что обычное чтение из файла не должно мешать вам читать со стандартного ввода.

Edit2 - я думаю, что fvu прав, если вы посмотрите на страницу, на которую вы ссылаетесь, там есть ответ, в котором говорится об использовании dup2() для копирования дескриптора файла stdin в дескриптор временного файла, заменить дескриптор файла для stdin чем-то другим , а затем снова замените его временной копией. Это похоже на то, что вы ищете

person MoMo    schedule 03.03.2014
comment
Я не уверен, подойдет ли fork()... Я не пытаюсь дублировать процесс, просто чтобы прекратить чтение из "имени файла" и снова начать чтение с "традиционного" стандартного ввода - person user3366297; 04.03.2014