Suppose I have this C++ program: #include <iostream> int main (int argc, char** argv) { while (1) { char cmd[80]; std::cin.getline(cmd, 80); std::cout << "response to " << cmd << std::endl; } } compiled by: c++ -o junk junk.cpp and I have this bash script: #!/bin/bash ./junk <<EOF blah bleh \cC EOF echo "Something else" When I run the script, the program starts and waits for input forever. I have 2 questions: 1) The "blah" and "bleh" line are not echoed to cout. Why not? Does the here document not send the data to stdin? 2) How do I terminate the program? When run interactively, I use <ctrl>-C. Thanks, Steve
In article <20130624135817.10QZO.129278.root at cdptpa-web19-z02>, Steve <zephod at cfl.rr.com> wrote:> Suppose I have this C++ program: > #include <iostream> > int main (int argc, char** argv) > { > while (1) > { > char cmd[80]; > std::cin.getline(cmd, 80); > std::cout << "response to " << cmd << std::endl; > } > } > > compiled by: c++ -o junk junk.cpp > > and I have this bash script: > #!/bin/bash > ./junk <<EOF > blah > bleh > \cC > EOF > echo "Something else" > > When I run the script, the program starts and waits for input forever. > I have 2 questions: > 1) The "blah" and "bleh" line are not echoed to cout. Why not? Does the here document not send the data to stdin? > 2) How do I terminate the program? When run interactively, I use <ctrl>-C.You should be testing the return value from std::cin.getline() for end-of-file. You are not testing it for any error. Always test return values. In your script, the end of the here document will cause your program to see end-of-file (this is NOT the string "EOF" - that's just the way you denote the end of the here doc). And you really ought to find a forum or mailing list where this kind of question is ON-topic. Flagging the subject OT isn't a magic permission to post anything you like! Cheers Tony -- Tony Mountifield Work: tony at softins.co.uk - http://www.softins.co.uk Play: tony at mountifield.org - http://tony.mountifield.org
Steve wrote:> Suppose I have this C++ program: > #include <iostream> > int main (int argc, char** argv) > { > while (1) > { > char cmd[80]; > std::cin.getline(cmd, 80); > std::cout << "response to " << cmd << std::endl; > } > } > > compiled by: c++ -o junk junk.cpp > > and I have this bash script: > #!/bin/bash > ./junk <<EOF > blah > bleh > \cC > EOF > echo "Something else" > > When I run the script, the program starts and waits for input forever. > I have 2 questions: > 1) The "blah" and "bleh" line are not echoed to cout. Why not? Does the > here document not send the data to stdin? > 2) How do I terminate the program? When run interactively, I use <ctrl>-C.I've only done a tiny bit of C++, but a bunch of years of C. First, I think the \cC is doing something odd; in vi, I'd have tried typing it in with <ctrl-v><ctrl-c>. Second, do you want the output to be "blah bleh"? Finally, I am *very* strongly *not* a fan of while. If I have to use it, I set *some* limit - in this case, I'd look for an end-of-file, or some word you decide for "stop here". As the old joke goes, about hunting elephants in Africa, a programmer sets up a search patter up, across, up, back, starting in Capetown and ending in Cairo. The *experienced* programmer puts an elephant in the zoo in Cairo to ensure termination of the loop. mark