C++: 파일에서 cin으로 리디렉션하고 사용자가 입력을 입력한 것처럼 표시하는 방법

C++: 파일에서 cin으로 리디렉션하고 사용자가 입력을 입력한 것처럼 표시하는 방법

cin나는 8개의 숫자를 읽고 이를 bash 쉘에서 실행하는 간단한 C++ 프로그램을 가지고 있습니다 . 터미널에서 실행하면 다음과 같습니다(사용자가 숫자 1-8을 입력함).

./add8
Please enter eight numbers: 1 2 3 4 5 6 7 8
The sum is: 36 

8개의 숫자(예: "1 2 3 4 5 6 7 8" 및 개행 문자)가 있는 파일을 프로그램으로 리디렉션하려고 하는데 입력 내용이 화면에 표시되지 않습니다.

./add8 < my_eight_numbers.txt
Please enter eight numbers: The sum is: 36

파일을 프로그램으로 리디렉션하는 것이 가능합니까?그리고사용자 유형에 따라 입력을 표시하시겠습니까?

답변1

관심을 가질 만한 내용입니다..

기본적으로 터미널에 표준 입력이 있는지, 아니면 일종의 파이프/리디렉션이 있는지 확인해야 합니다. 이를 위해 이 기능을 사용할 수 있습니다 isatty.

int main(void){
    char buffer[N];
    int sum;

    /* Load buffer from stdin with fgets, fread, read, ... */

    if(!isatty(fileno(stdin)))
        printf("%s\n", buffer);

    /* Compute sum... */

    printf("The sum is %d.\n", sum);
}

이 경우 stdin이 tty가 아닌 경우(입력이 아직 입력되지 않았음을 의미) 프로그램은 합계를 계산하기 전에 버퍼를 인쇄합니다.

내 시스템에서는 isatty함수가 unistd.h. 당신은 또한 stdio.h얻을 필요가 있습니다 fileno.

답변2

C++ - 방법은 다음과 같습니다. (죄송합니다. C++로 프로그래밍한 지 오래되었습니다.)

  1. 파일을 읽을 때 모든 문자를 stdout(ostream)으로 출력하려면 ifstream '>>' 연산자를 오버로드하세요.
  2. 위치 인수를 구문 분석하여 배열로 전달합니다.
  3. 오버로드된 ifstream을 사용하여 파일을 읽고 결과를 계산합니다.

도움이 되길 바랍니다

답변3

일반 터미널은 입력된 내용을 다시 표시합니다. 당신이 원하는 것은 입력이 터미널이 아니지만 동시에 출력이 터미널인 경우 이 동작을 시뮬레이션하는 것 같습니다.

파일 설명자가 터미널을 참조하는지 테스트할 수 있습니다.이사티(3).

어쨌든 이렇게 하는 것(isatty를 사용하는 대화형 CLI 프로그램)은 Unix의 정신에 매우 어긋납니다. 그러한 프로그램은 작성하지 않는 것이 가장 좋습니다. 가능하다면 Cli 프로그램이 필터가 되어야 합니다.

관련 정보