![C++: 파일에서 cin으로 리디렉션하고 사용자가 입력을 입력한 것처럼 표시하는 방법](https://linux55.com/image/72757/C%2B%2B%3A%20%ED%8C%8C%EC%9D%BC%EC%97%90%EC%84%9C%20cin%EC%9C%BC%EB%A1%9C%20%EB%A6%AC%EB%94%94%EB%A0%89%EC%85%98%ED%95%98%EA%B3%A0%20%EC%82%AC%EC%9A%A9%EC%9E%90%EA%B0%80%20%EC%9E%85%EB%A0%A5%EC%9D%84%20%EC%9E%85%EB%A0%A5%ED%95%9C%20%EA%B2%83%EC%B2%98%EB%9F%BC%20%ED%91%9C%EC%8B%9C%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
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++로 프로그래밍한 지 오래되었습니다.)
- 파일을 읽을 때 모든 문자를 stdout(ostream)으로 출력하려면 ifstream '>>' 연산자를 오버로드하세요.
- 위치 인수를 구문 분석하여 배열로 전달합니다.
- 오버로드된 ifstream을 사용하여 파일을 읽고 결과를 계산합니다.
도움이 되길 바랍니다
답변3
일반 터미널은 입력된 내용을 다시 표시합니다. 당신이 원하는 것은 입력이 터미널이 아니지만 동시에 출력이 터미널인 경우 이 동작을 시뮬레이션하는 것 같습니다.
파일 설명자가 터미널을 참조하는지 테스트할 수 있습니다.이사티(3).
어쨌든 이렇게 하는 것(isatty를 사용하는 대화형 CLI 프로그램)은 Unix의 정신에 매우 어긋납니다. 그러한 프로그램은 작성하지 않는 것이 가장 좋습니다. 가능하다면 Cli 프로그램이 필터가 되어야 합니다.