내 프로그램은 C++로 작성하려고하는 일반적인 셸입니다. 명령 줄에서 명령을받는 것 외에도 명령을 파일에서 읽을 수 있어야합니다. 파일 이름은 리디렉션이 아닌 선택적 arg로 전달됩니다.ifstream이 stdin에 연결되어 있는지 확인하는 멋진 방법이 있습니까?
arg가 있으면 전달 된 파일 이름을 열고 그렇지 않으면 "/ dev/stdin"을 엽니 다. 나는 dev 파일을 여는 것에 대해 흥분하지 않고 나의 주된 질문은 아니지만 누군가가 더 좋은 방법을 가지고 있다면 나는 그것을 듣고 싶어한다.
결국 셸에 주어진 명령을 읽어야하지만 입력이 파일에서 오는 경우 프롬프트를 건너 뛰거나 프롬프트를 건너 뛰려면 먼저 프롬프트를 제시해야합니다. 내 질문은 : getCommand
에서 입력 스트림이 전역인지 또는 bool 또는 이와 유사한 해킹을 전달하는 것보다 더 좋은지 결정하는 더 좋은 방법이 있습니까?
내가 어떻게 든 std :: cin을/dev 파일을 열지 않고 사용할 수 있다면 스트림을 istream
으로 전달할 수있다. 그 둘을 쉽게 구별 할 수 있을까요? E.G. if (source == cin)
?
모든 제안을 주셔서 감사합니다. 당신이 당신의 변수의 유형으로 std::istream&
를 사용하는 경우
bool getCommand(ifstream source, std::string command)
{
if (source == stdin)
//print prompt to stdout
// do the rest of stuff
return true;
}
int main(int argc, char *argv[])
{
std::ifstream input;
std::string command;
if (argc == 2)
{
input.open(argv[1], std::ifstream::in);
if (! input)
{
perror("input command file stream open");
exit(EXIT_FAILURE);
}
}
else
{
input.open("/dev/stdin", std::ifstream::in);
if (! input)
{
perror("input stdin stream open");
exit(EXIT_FAILURE);
}
}
//.......
if (getCommand(input, command))
//.......
}
는 "나는 내가 표준 입력에서 읽고 있습니다 경우 프롬프트를 제시해야"-이 잘못된 상태 것 같다 . 터미널에서 읽는 중이면 프롬프트를 제시해야합니다. 누군가에게 파이핑을하거나 프로그램으로 입력을 리디렉션하는 특별한 코드를 작성하는 것은 반 사회적입니다 :-) –
예, 터미널 인 입력을 찾습니다. bash로 소스 코드를 사용하여 사용할 함수를 찾을 수 있습니다. 또는 bash 쉘을 strace하여 파일 디스크립터 0을 확인하기 위해 무엇을 호출하는지 확인하십시오. –
예제 코드에는 다른 많은 문제점이 있습니다. std :: ifstream을 값으로 전달하고, out 매개 변수 일 때 참조로 std :: string을 전달하지 않습니다. – goji