Frost Moon Project

リダイレクト/パイプでstdinを使用した後、fgets()で文字の入力を行う方法 - Frost Moon Project アクセスランキング

Home > Tips > リダイレクト/パイプでstdinを使用した後、fgets()で文字の入力を行う方法

リダイレクト/パイプでstdinを使用した後、fgets()で文字の入力を行う方法

  1. 問題
  2. 解決方法

問題
a.exe < file
dir /b | b.exe
の様に、リダイレクトやパイプを使用した後、fgets()などで文字の入力を求めようとしても、
一時停止してくれず、文字の入力が出来ません。
stdin_again.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<stdio.h>
#include<string.h>
#include<unistd.h>
 
int main(){
  if(!isatty(fileno(stdin))){
    char line[128]={0};
 
    while(fgets(line,sizeof(line),stdin)!=NULL){
        if(char* p=strchr(line,'\n'))*p='\0';
        printf("%s\n",line);
    }
 
    printf("↑から好きな数字を選んで下さい。\n");
 
    char number[128]={0};
 
    fgets(number,sizeof(number),stdin);
    if(char* p=strchr(number,'\n'))*p='\0';
    printf("なんでや!%s関係ないやろ!\n",number);
  }
}
 
        


解決方法
標準入力をコンソールに割り当てることで、fgets()などによる文字の入力ができるようになります。
割り当てにはfreopen()を使用します。

今回は入力ストリームのクリアも行うようにしました。
stdin_again_fix.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include<stdio.h>
#include<string.h>
#include<unistd.h>
 
int main(){
  if(!isatty(fileno(stdin))){
    char line[128]={0};
 
    while(fgets(line,sizeof(line),stdin)!=NULL){
        if(char* p=strchr(line,'\n'))*p='\0';
        else while(getchar()!='\n');
        printf("%s\n",line);
    }
 
    freopen("CON","r",stdin);
 
    printf("↑から好きな数字を選んで下さい。\n");
 
    char number[128]={0};
 
    fgets(number,sizeof(number),stdin);
    if(char* p=strchr(number,'\n'))*p='\0';
    else while(getchar()!='\n');
    printf("なんでや!%s関係ないやろ!\n",number);
  }
}
 
        

※Linuxで利用する場合、"CON"ではなく"/dev/tty"として下さい。


無事、リダイレクト/パイプでstdinを使用した後、fgets()で文字の入力を行うことが出来ました。


関連Tips
リダイレクト/パイプを使用しているか識別する方法

Copyright(C) 2007-2025 Frost Moon Project


Home > Tips > リダイレクト/パイプでstdinを使用した後、fgets()で文字の入力を行う方法