For the while (CIN>>STR) and Ctrl z issues, the following explanation is available online:
--------------------------------------------------------------------------------------------------------------- ---------------
The input (CIN) buffer is a row buffer. When you enter a string of characters from the keyboard and press ENTER, the characters inode are first sent to the input buffer for storage. Each time you press ENTER, CIN
The input buffers are detected for readable data.
CIN also checks to see if the keyboard has a CTRL + Z or CTRL+D key pressed as the end-of-flow flag, which is checked in two ways: block and non-blocking.
The blocking check method refers to whether the previous Ctrl + Z key Press is checked only after the return press is pressed, and the non-blocking style refers to the way in which the response is pressed immediately after ctrl+d. If a character has been entered from the keyboard before pressing Ctrl+d, the CTRL+D function is equivalent to a carriage return, which means that the characters are sent to the input buffer for reading, and ctrl+d no longer functions as a stream terminator. If there is no keyboard input before pressing Ctrl+d, then CTRL+D is the signal for the end of the stream.
The blocking style has one feature: it is possible to detect if there is a CTRL + Z press before the carriage return. Another feature is that if there is readable data in the input buffer, CTRL + Z is not detected (because there is data to be read and cannot be considered at the end of the stream). It is also important to know that CTRL + Z produces not a normal ASCII value, that is, it produces not a character, so it will not be stored in the input buffer as other characters entered from the keyboard.
Windows system generally uses the blocking check Ctrl + Z, Unix/linux system generally adopts non-blocking inspection ctrl+d.
--------------------------------------------------------------------------------------------------------------- --------------------
The above means that in the window to press CTRL z + Ente to end the loop, and on the UNIX system just press CTRL D
At the same time, summarize some experimental results on this machine. Windows 7 + vs2010
Approximate procedure:
String str;
while (CIN >> str)
cout<<str<<endl;
Summary of the experimental results:
When you enter ASD (CTRL + Z) (enter), you continue to require keyboard input and then enter FF (enter), and the result output is ASD→FF
When input ASD (ctrl + Z) sad (enter), the same request input, and then enter FF (enter), the result output is still Asd→ff,ctrl Z behind the sad is ignored
So, there are some rules to summarize.
(1) When the readable data appears before pressing CTLR Z, CTRL z+enter becomes the ' → ' character, while the data behind the CTRL z in the peer is ignored.
And because Ctrl z+enter becomes the ' → ' character, so Cin>>str's read is not over, continue to request input and press ENTER to announce the end of a read.
(2) If you need to end the loop, its method must be the line input is the CTRL Z+enter,ctrl Z can not have any characters, even cin>>str not read the space is not.
Finally, the problem has not been tested in UNIX systems.
Discussion on the problems related to while (CIN>>STR) and Ctrl z in C + +