while (cin >> *pchar) awaits further input after Ctrl-Z












0















In my Introduction to C++ classes, we were asked to write a function that returns the length of a string using pointers. The code that I wrote (see full code below) seems to work just fine, but here's the thing I don't understand.



I would think typing 'Yes' followed by Ctrl-Z ( I'm using Windows 10) in the console would stop the input. However, after pressing Ctrl-Z -> Enter the console still waits for further input. I have to start a new line after 'Yes', press Ctrl-Z and then hit Enter again to stop the input.



Why is this the case? Is there a way to stop the input after pressing just Ctrl-Z without any of the two new lines?



I read several posts on cin here, including this, this, and this, but they don't seem to answer my question.



#include "pch.h"
#include <iostream>
using namespace std;

unsigned strlen(const char *str)
{
int count = 0;
while (*str != '') { str++; count++; }
return count;
}

int main()
{
char str[100] = {};
char *pchar;
pchar = str;
while (cin >> *pchar) pchar++;
pchar = str;
cout << 'n' << strlen(pchar);
return 0;
}









share|improve this question




















  • 4





    Not trying to put too fine a point to it, but your C++ introduction course appears to teach C first... which is not a good idea. You shouldn't be doing char * in C++. Ever. Nor should you be doing strlen() by hand (a.k.a. "reinventing the wheel"). I know you probably cannot change any of that; I am just voicing my sadness that so many "Intro to C++" courses out there are still "C (with classes)". This is doing both you and C++'s reputation a disservice.

    – DevSolar
    Nov 19 '18 at 9:37








  • 4





    @JohnAllison: ...pointers, which you shouldn't have to touch at all, or at least not until you're doing the advanced course. You're being taught all the C stuff -- pointers, arrays, char * -- all of which is unnecessary / bad C++ style, and which you will have to un-learn once you get to "real" C++. Instead of showing you <string> and references and having you do real stuff instead of reinventing the (C) wheel. I feel this is wasting your time, and making things unnecessarily difficult for you (and the instructor).

    – DevSolar
    Nov 19 '18 at 9:53








  • 2





    @JohnAllison: In C++ we have std::string and the corresponding functions operating on those. Just two counterquestions: What happens, in your code, if the user enters the 101st character without ending the input? What happens if, e.g. by input redirection, the user enters a null byte somewhere in his input? Also, you can't teach C strings a.k.a. char without teaching pointers as well... which IMHO shouldn't be taught in an intro to C++, at all.

    – DevSolar
    Nov 19 '18 at 10:07








  • 1





    @marvin: His course should have started with the C++ that makes buffer overflows a non-issue. And I know I am not answering. I am commenting.

    – DevSolar
    Nov 19 '18 at 10:12






  • 2





    @JohnAllison: And I understand the "bottom up" approach and all that, but I disagree with its helpfulness. Students want to achieve results. Especially with C++ where everybody tells you how godawful hard it reputedly is (which it is only if you have to learn, then unlearn C first), I find it more helpful to go top-down, and dive right in using string, vector, <algorithm>, polymorphy and templates to their full potential instead of worrying about what's under the hood. That's for the advanced course, "library development"...

    – DevSolar
    Nov 19 '18 at 11:33


















0















In my Introduction to C++ classes, we were asked to write a function that returns the length of a string using pointers. The code that I wrote (see full code below) seems to work just fine, but here's the thing I don't understand.



I would think typing 'Yes' followed by Ctrl-Z ( I'm using Windows 10) in the console would stop the input. However, after pressing Ctrl-Z -> Enter the console still waits for further input. I have to start a new line after 'Yes', press Ctrl-Z and then hit Enter again to stop the input.



Why is this the case? Is there a way to stop the input after pressing just Ctrl-Z without any of the two new lines?



I read several posts on cin here, including this, this, and this, but they don't seem to answer my question.



#include "pch.h"
#include <iostream>
using namespace std;

unsigned strlen(const char *str)
{
int count = 0;
while (*str != '') { str++; count++; }
return count;
}

int main()
{
char str[100] = {};
char *pchar;
pchar = str;
while (cin >> *pchar) pchar++;
pchar = str;
cout << 'n' << strlen(pchar);
return 0;
}









share|improve this question




















  • 4





    Not trying to put too fine a point to it, but your C++ introduction course appears to teach C first... which is not a good idea. You shouldn't be doing char * in C++. Ever. Nor should you be doing strlen() by hand (a.k.a. "reinventing the wheel"). I know you probably cannot change any of that; I am just voicing my sadness that so many "Intro to C++" courses out there are still "C (with classes)". This is doing both you and C++'s reputation a disservice.

    – DevSolar
    Nov 19 '18 at 9:37








  • 4





    @JohnAllison: ...pointers, which you shouldn't have to touch at all, or at least not until you're doing the advanced course. You're being taught all the C stuff -- pointers, arrays, char * -- all of which is unnecessary / bad C++ style, and which you will have to un-learn once you get to "real" C++. Instead of showing you <string> and references and having you do real stuff instead of reinventing the (C) wheel. I feel this is wasting your time, and making things unnecessarily difficult for you (and the instructor).

    – DevSolar
    Nov 19 '18 at 9:53








  • 2





    @JohnAllison: In C++ we have std::string and the corresponding functions operating on those. Just two counterquestions: What happens, in your code, if the user enters the 101st character without ending the input? What happens if, e.g. by input redirection, the user enters a null byte somewhere in his input? Also, you can't teach C strings a.k.a. char without teaching pointers as well... which IMHO shouldn't be taught in an intro to C++, at all.

    – DevSolar
    Nov 19 '18 at 10:07








  • 1





    @marvin: His course should have started with the C++ that makes buffer overflows a non-issue. And I know I am not answering. I am commenting.

    – DevSolar
    Nov 19 '18 at 10:12






  • 2





    @JohnAllison: And I understand the "bottom up" approach and all that, but I disagree with its helpfulness. Students want to achieve results. Especially with C++ where everybody tells you how godawful hard it reputedly is (which it is only if you have to learn, then unlearn C first), I find it more helpful to go top-down, and dive right in using string, vector, <algorithm>, polymorphy and templates to their full potential instead of worrying about what's under the hood. That's for the advanced course, "library development"...

    – DevSolar
    Nov 19 '18 at 11:33
















0












0








0








In my Introduction to C++ classes, we were asked to write a function that returns the length of a string using pointers. The code that I wrote (see full code below) seems to work just fine, but here's the thing I don't understand.



I would think typing 'Yes' followed by Ctrl-Z ( I'm using Windows 10) in the console would stop the input. However, after pressing Ctrl-Z -> Enter the console still waits for further input. I have to start a new line after 'Yes', press Ctrl-Z and then hit Enter again to stop the input.



Why is this the case? Is there a way to stop the input after pressing just Ctrl-Z without any of the two new lines?



I read several posts on cin here, including this, this, and this, but they don't seem to answer my question.



#include "pch.h"
#include <iostream>
using namespace std;

unsigned strlen(const char *str)
{
int count = 0;
while (*str != '') { str++; count++; }
return count;
}

int main()
{
char str[100] = {};
char *pchar;
pchar = str;
while (cin >> *pchar) pchar++;
pchar = str;
cout << 'n' << strlen(pchar);
return 0;
}









share|improve this question
















In my Introduction to C++ classes, we were asked to write a function that returns the length of a string using pointers. The code that I wrote (see full code below) seems to work just fine, but here's the thing I don't understand.



I would think typing 'Yes' followed by Ctrl-Z ( I'm using Windows 10) in the console would stop the input. However, after pressing Ctrl-Z -> Enter the console still waits for further input. I have to start a new line after 'Yes', press Ctrl-Z and then hit Enter again to stop the input.



Why is this the case? Is there a way to stop the input after pressing just Ctrl-Z without any of the two new lines?



I read several posts on cin here, including this, this, and this, but they don't seem to answer my question.



#include "pch.h"
#include <iostream>
using namespace std;

unsigned strlen(const char *str)
{
int count = 0;
while (*str != '') { str++; count++; }
return count;
}

int main()
{
char str[100] = {};
char *pchar;
pchar = str;
while (cin >> *pchar) pchar++;
pchar = str;
cout << 'n' << strlen(pchar);
return 0;
}






c++ cin






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 19 '18 at 9:30







John Allison

















asked Nov 19 '18 at 8:52









John AllisonJohn Allison

4051316




4051316








  • 4





    Not trying to put too fine a point to it, but your C++ introduction course appears to teach C first... which is not a good idea. You shouldn't be doing char * in C++. Ever. Nor should you be doing strlen() by hand (a.k.a. "reinventing the wheel"). I know you probably cannot change any of that; I am just voicing my sadness that so many "Intro to C++" courses out there are still "C (with classes)". This is doing both you and C++'s reputation a disservice.

    – DevSolar
    Nov 19 '18 at 9:37








  • 4





    @JohnAllison: ...pointers, which you shouldn't have to touch at all, or at least not until you're doing the advanced course. You're being taught all the C stuff -- pointers, arrays, char * -- all of which is unnecessary / bad C++ style, and which you will have to un-learn once you get to "real" C++. Instead of showing you <string> and references and having you do real stuff instead of reinventing the (C) wheel. I feel this is wasting your time, and making things unnecessarily difficult for you (and the instructor).

    – DevSolar
    Nov 19 '18 at 9:53








  • 2





    @JohnAllison: In C++ we have std::string and the corresponding functions operating on those. Just two counterquestions: What happens, in your code, if the user enters the 101st character without ending the input? What happens if, e.g. by input redirection, the user enters a null byte somewhere in his input? Also, you can't teach C strings a.k.a. char without teaching pointers as well... which IMHO shouldn't be taught in an intro to C++, at all.

    – DevSolar
    Nov 19 '18 at 10:07








  • 1





    @marvin: His course should have started with the C++ that makes buffer overflows a non-issue. And I know I am not answering. I am commenting.

    – DevSolar
    Nov 19 '18 at 10:12






  • 2





    @JohnAllison: And I understand the "bottom up" approach and all that, but I disagree with its helpfulness. Students want to achieve results. Especially with C++ where everybody tells you how godawful hard it reputedly is (which it is only if you have to learn, then unlearn C first), I find it more helpful to go top-down, and dive right in using string, vector, <algorithm>, polymorphy and templates to their full potential instead of worrying about what's under the hood. That's for the advanced course, "library development"...

    – DevSolar
    Nov 19 '18 at 11:33
















  • 4





    Not trying to put too fine a point to it, but your C++ introduction course appears to teach C first... which is not a good idea. You shouldn't be doing char * in C++. Ever. Nor should you be doing strlen() by hand (a.k.a. "reinventing the wheel"). I know you probably cannot change any of that; I am just voicing my sadness that so many "Intro to C++" courses out there are still "C (with classes)". This is doing both you and C++'s reputation a disservice.

    – DevSolar
    Nov 19 '18 at 9:37








  • 4





    @JohnAllison: ...pointers, which you shouldn't have to touch at all, or at least not until you're doing the advanced course. You're being taught all the C stuff -- pointers, arrays, char * -- all of which is unnecessary / bad C++ style, and which you will have to un-learn once you get to "real" C++. Instead of showing you <string> and references and having you do real stuff instead of reinventing the (C) wheel. I feel this is wasting your time, and making things unnecessarily difficult for you (and the instructor).

    – DevSolar
    Nov 19 '18 at 9:53








  • 2





    @JohnAllison: In C++ we have std::string and the corresponding functions operating on those. Just two counterquestions: What happens, in your code, if the user enters the 101st character without ending the input? What happens if, e.g. by input redirection, the user enters a null byte somewhere in his input? Also, you can't teach C strings a.k.a. char without teaching pointers as well... which IMHO shouldn't be taught in an intro to C++, at all.

    – DevSolar
    Nov 19 '18 at 10:07








  • 1





    @marvin: His course should have started with the C++ that makes buffer overflows a non-issue. And I know I am not answering. I am commenting.

    – DevSolar
    Nov 19 '18 at 10:12






  • 2





    @JohnAllison: And I understand the "bottom up" approach and all that, but I disagree with its helpfulness. Students want to achieve results. Especially with C++ where everybody tells you how godawful hard it reputedly is (which it is only if you have to learn, then unlearn C first), I find it more helpful to go top-down, and dive right in using string, vector, <algorithm>, polymorphy and templates to their full potential instead of worrying about what's under the hood. That's for the advanced course, "library development"...

    – DevSolar
    Nov 19 '18 at 11:33










4




4





Not trying to put too fine a point to it, but your C++ introduction course appears to teach C first... which is not a good idea. You shouldn't be doing char * in C++. Ever. Nor should you be doing strlen() by hand (a.k.a. "reinventing the wheel"). I know you probably cannot change any of that; I am just voicing my sadness that so many "Intro to C++" courses out there are still "C (with classes)". This is doing both you and C++'s reputation a disservice.

– DevSolar
Nov 19 '18 at 9:37







Not trying to put too fine a point to it, but your C++ introduction course appears to teach C first... which is not a good idea. You shouldn't be doing char * in C++. Ever. Nor should you be doing strlen() by hand (a.k.a. "reinventing the wheel"). I know you probably cannot change any of that; I am just voicing my sadness that so many "Intro to C++" courses out there are still "C (with classes)". This is doing both you and C++'s reputation a disservice.

– DevSolar
Nov 19 '18 at 9:37






4




4





@JohnAllison: ...pointers, which you shouldn't have to touch at all, or at least not until you're doing the advanced course. You're being taught all the C stuff -- pointers, arrays, char * -- all of which is unnecessary / bad C++ style, and which you will have to un-learn once you get to "real" C++. Instead of showing you <string> and references and having you do real stuff instead of reinventing the (C) wheel. I feel this is wasting your time, and making things unnecessarily difficult for you (and the instructor).

– DevSolar
Nov 19 '18 at 9:53







@JohnAllison: ...pointers, which you shouldn't have to touch at all, or at least not until you're doing the advanced course. You're being taught all the C stuff -- pointers, arrays, char * -- all of which is unnecessary / bad C++ style, and which you will have to un-learn once you get to "real" C++. Instead of showing you <string> and references and having you do real stuff instead of reinventing the (C) wheel. I feel this is wasting your time, and making things unnecessarily difficult for you (and the instructor).

– DevSolar
Nov 19 '18 at 9:53






2




2





@JohnAllison: In C++ we have std::string and the corresponding functions operating on those. Just two counterquestions: What happens, in your code, if the user enters the 101st character without ending the input? What happens if, e.g. by input redirection, the user enters a null byte somewhere in his input? Also, you can't teach C strings a.k.a. char without teaching pointers as well... which IMHO shouldn't be taught in an intro to C++, at all.

– DevSolar
Nov 19 '18 at 10:07







@JohnAllison: In C++ we have std::string and the corresponding functions operating on those. Just two counterquestions: What happens, in your code, if the user enters the 101st character without ending the input? What happens if, e.g. by input redirection, the user enters a null byte somewhere in his input? Also, you can't teach C strings a.k.a. char without teaching pointers as well... which IMHO shouldn't be taught in an intro to C++, at all.

– DevSolar
Nov 19 '18 at 10:07






1




1





@marvin: His course should have started with the C++ that makes buffer overflows a non-issue. And I know I am not answering. I am commenting.

– DevSolar
Nov 19 '18 at 10:12





@marvin: His course should have started with the C++ that makes buffer overflows a non-issue. And I know I am not answering. I am commenting.

– DevSolar
Nov 19 '18 at 10:12




2




2





@JohnAllison: And I understand the "bottom up" approach and all that, but I disagree with its helpfulness. Students want to achieve results. Especially with C++ where everybody tells you how godawful hard it reputedly is (which it is only if you have to learn, then unlearn C first), I find it more helpful to go top-down, and dive right in using string, vector, <algorithm>, polymorphy and templates to their full potential instead of worrying about what's under the hood. That's for the advanced course, "library development"...

– DevSolar
Nov 19 '18 at 11:33







@JohnAllison: And I understand the "bottom up" approach and all that, but I disagree with its helpfulness. Students want to achieve results. Especially with C++ where everybody tells you how godawful hard it reputedly is (which it is only if you have to learn, then unlearn C first), I find it more helpful to go top-down, and dive right in using string, vector, <algorithm>, polymorphy and templates to their full potential instead of worrying about what's under the hood. That's for the advanced course, "library development"...

– DevSolar
Nov 19 '18 at 11:33














2 Answers
2






active

oldest

votes


















2














If you press Ctrl-Z after typing some other text, it flushes the line buffer (it does not set end-of-file condition).



You have to press it twice in a row; or press it after a newline; to cause the end-of-file condition to occur.



Your misunderstanding is to do with the windows console behaviour, not with C++ streams per se.



See also: Why do I require multiple EOF (CTRL+Z) characters?






share|improve this answer
























  • This helped a lot, thanks!

    – John Allison
    Nov 19 '18 at 11:15











  • yes I see. This problem is actually kinda Operating System dependent per se hey

    – marvinIsSacul
    Nov 19 '18 at 11:25













  • @marvinIsSacul yes, although I think ^D in unix works similarly (it's just a line flush if it occurs during a line)

    – M.M
    Nov 19 '18 at 11:26



















1














Firstly we have to understand what you while loop actually does.



while (cin >> *pchar) pchar++; says that continue getting input from the stdin whilst cin has not encountered an error (or to be specific whilst !cin.fail() == true).



Note that cin is basically an object of std::istream.



Then secondly we have to understand what causes std::istream::fail to return true.
Here they are saying that std::istream::fail returns true if the badbit or failbit flags are set (and/or also if any non EOF error occurs).



Having said that, Ctrl-Z is actually EOF (end of file). And based on what I have said above, std::istream::fail will return true if any none EOF error occurs, and of course return false if an EOF occurs.



So in short, EOF/Ctrl-Z does not cause std::istream::fail to return true hence the loop will continue running.



If you really want to have your program cease executing when EOF/Ctrl-Z gets hit, then adjust your loop to something like this...



 while ((cin >> *pchar) && !cin.eof()) pchar++;


Now the loop above reads, whilst std::istream::fail() == false and no EOF/Ctrl-Z character has been entered, continue looping. Else cease the loop.



I hope that fully answers you.






share|improve this answer


























  • Thanks - it's almost clear now. So turning back to my sequence that worked (Enter - Ctrl-Z - Enter), what exactly causes cin.fail() get to true?

    – John Allison
    Nov 19 '18 at 10:51













  • that sequence worked with you old code?

    – marvinIsSacul
    Nov 19 '18 at 10:55











  • It did, yes. Typing, e.g., 'Yes', then Enter, Ctrl-Z, Enter stops the input and has 3 as an output, so works just fine. Moreover, I just noted that adding !cin.eof() in the condition doesn't help. Pressing Ctrl-Z -> Enter right after 'Yes' doesn't stop the input either.

    – John Allison
    Nov 19 '18 at 10:59













  • if cin >> *pchar sets eofbit, it will also set failbit due to failing to read a character, this is explained by the link you posted. The advice to add in a test of !cin.eof() is poor

    – M.M
    Nov 19 '18 at 11:04













  • From here, I think its because the end of the stream (EOF) was encountered while reading the next character (Enter). I'm not quite sure. Follow that link and many others within that, to find out more

    – marvinIsSacul
    Nov 19 '18 at 11:16











Your Answer






StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53371127%2fwhile-cin-pchar-awaits-further-input-after-ctrl-z%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























2 Answers
2






active

oldest

votes








2 Answers
2






active

oldest

votes









active

oldest

votes






active

oldest

votes









2














If you press Ctrl-Z after typing some other text, it flushes the line buffer (it does not set end-of-file condition).



You have to press it twice in a row; or press it after a newline; to cause the end-of-file condition to occur.



Your misunderstanding is to do with the windows console behaviour, not with C++ streams per se.



See also: Why do I require multiple EOF (CTRL+Z) characters?






share|improve this answer
























  • This helped a lot, thanks!

    – John Allison
    Nov 19 '18 at 11:15











  • yes I see. This problem is actually kinda Operating System dependent per se hey

    – marvinIsSacul
    Nov 19 '18 at 11:25













  • @marvinIsSacul yes, although I think ^D in unix works similarly (it's just a line flush if it occurs during a line)

    – M.M
    Nov 19 '18 at 11:26
















2














If you press Ctrl-Z after typing some other text, it flushes the line buffer (it does not set end-of-file condition).



You have to press it twice in a row; or press it after a newline; to cause the end-of-file condition to occur.



Your misunderstanding is to do with the windows console behaviour, not with C++ streams per se.



See also: Why do I require multiple EOF (CTRL+Z) characters?






share|improve this answer
























  • This helped a lot, thanks!

    – John Allison
    Nov 19 '18 at 11:15











  • yes I see. This problem is actually kinda Operating System dependent per se hey

    – marvinIsSacul
    Nov 19 '18 at 11:25













  • @marvinIsSacul yes, although I think ^D in unix works similarly (it's just a line flush if it occurs during a line)

    – M.M
    Nov 19 '18 at 11:26














2












2








2







If you press Ctrl-Z after typing some other text, it flushes the line buffer (it does not set end-of-file condition).



You have to press it twice in a row; or press it after a newline; to cause the end-of-file condition to occur.



Your misunderstanding is to do with the windows console behaviour, not with C++ streams per se.



See also: Why do I require multiple EOF (CTRL+Z) characters?






share|improve this answer













If you press Ctrl-Z after typing some other text, it flushes the line buffer (it does not set end-of-file condition).



You have to press it twice in a row; or press it after a newline; to cause the end-of-file condition to occur.



Your misunderstanding is to do with the windows console behaviour, not with C++ streams per se.



See also: Why do I require multiple EOF (CTRL+Z) characters?







share|improve this answer












share|improve this answer



share|improve this answer










answered Nov 19 '18 at 11:02









M.MM.M

106k11117239




106k11117239













  • This helped a lot, thanks!

    – John Allison
    Nov 19 '18 at 11:15











  • yes I see. This problem is actually kinda Operating System dependent per se hey

    – marvinIsSacul
    Nov 19 '18 at 11:25













  • @marvinIsSacul yes, although I think ^D in unix works similarly (it's just a line flush if it occurs during a line)

    – M.M
    Nov 19 '18 at 11:26



















  • This helped a lot, thanks!

    – John Allison
    Nov 19 '18 at 11:15











  • yes I see. This problem is actually kinda Operating System dependent per se hey

    – marvinIsSacul
    Nov 19 '18 at 11:25













  • @marvinIsSacul yes, although I think ^D in unix works similarly (it's just a line flush if it occurs during a line)

    – M.M
    Nov 19 '18 at 11:26

















This helped a lot, thanks!

– John Allison
Nov 19 '18 at 11:15





This helped a lot, thanks!

– John Allison
Nov 19 '18 at 11:15













yes I see. This problem is actually kinda Operating System dependent per se hey

– marvinIsSacul
Nov 19 '18 at 11:25







yes I see. This problem is actually kinda Operating System dependent per se hey

– marvinIsSacul
Nov 19 '18 at 11:25















@marvinIsSacul yes, although I think ^D in unix works similarly (it's just a line flush if it occurs during a line)

– M.M
Nov 19 '18 at 11:26





@marvinIsSacul yes, although I think ^D in unix works similarly (it's just a line flush if it occurs during a line)

– M.M
Nov 19 '18 at 11:26













1














Firstly we have to understand what you while loop actually does.



while (cin >> *pchar) pchar++; says that continue getting input from the stdin whilst cin has not encountered an error (or to be specific whilst !cin.fail() == true).



Note that cin is basically an object of std::istream.



Then secondly we have to understand what causes std::istream::fail to return true.
Here they are saying that std::istream::fail returns true if the badbit or failbit flags are set (and/or also if any non EOF error occurs).



Having said that, Ctrl-Z is actually EOF (end of file). And based on what I have said above, std::istream::fail will return true if any none EOF error occurs, and of course return false if an EOF occurs.



So in short, EOF/Ctrl-Z does not cause std::istream::fail to return true hence the loop will continue running.



If you really want to have your program cease executing when EOF/Ctrl-Z gets hit, then adjust your loop to something like this...



 while ((cin >> *pchar) && !cin.eof()) pchar++;


Now the loop above reads, whilst std::istream::fail() == false and no EOF/Ctrl-Z character has been entered, continue looping. Else cease the loop.



I hope that fully answers you.






share|improve this answer


























  • Thanks - it's almost clear now. So turning back to my sequence that worked (Enter - Ctrl-Z - Enter), what exactly causes cin.fail() get to true?

    – John Allison
    Nov 19 '18 at 10:51













  • that sequence worked with you old code?

    – marvinIsSacul
    Nov 19 '18 at 10:55











  • It did, yes. Typing, e.g., 'Yes', then Enter, Ctrl-Z, Enter stops the input and has 3 as an output, so works just fine. Moreover, I just noted that adding !cin.eof() in the condition doesn't help. Pressing Ctrl-Z -> Enter right after 'Yes' doesn't stop the input either.

    – John Allison
    Nov 19 '18 at 10:59













  • if cin >> *pchar sets eofbit, it will also set failbit due to failing to read a character, this is explained by the link you posted. The advice to add in a test of !cin.eof() is poor

    – M.M
    Nov 19 '18 at 11:04













  • From here, I think its because the end of the stream (EOF) was encountered while reading the next character (Enter). I'm not quite sure. Follow that link and many others within that, to find out more

    – marvinIsSacul
    Nov 19 '18 at 11:16
















1














Firstly we have to understand what you while loop actually does.



while (cin >> *pchar) pchar++; says that continue getting input from the stdin whilst cin has not encountered an error (or to be specific whilst !cin.fail() == true).



Note that cin is basically an object of std::istream.



Then secondly we have to understand what causes std::istream::fail to return true.
Here they are saying that std::istream::fail returns true if the badbit or failbit flags are set (and/or also if any non EOF error occurs).



Having said that, Ctrl-Z is actually EOF (end of file). And based on what I have said above, std::istream::fail will return true if any none EOF error occurs, and of course return false if an EOF occurs.



So in short, EOF/Ctrl-Z does not cause std::istream::fail to return true hence the loop will continue running.



If you really want to have your program cease executing when EOF/Ctrl-Z gets hit, then adjust your loop to something like this...



 while ((cin >> *pchar) && !cin.eof()) pchar++;


Now the loop above reads, whilst std::istream::fail() == false and no EOF/Ctrl-Z character has been entered, continue looping. Else cease the loop.



I hope that fully answers you.






share|improve this answer


























  • Thanks - it's almost clear now. So turning back to my sequence that worked (Enter - Ctrl-Z - Enter), what exactly causes cin.fail() get to true?

    – John Allison
    Nov 19 '18 at 10:51













  • that sequence worked with you old code?

    – marvinIsSacul
    Nov 19 '18 at 10:55











  • It did, yes. Typing, e.g., 'Yes', then Enter, Ctrl-Z, Enter stops the input and has 3 as an output, so works just fine. Moreover, I just noted that adding !cin.eof() in the condition doesn't help. Pressing Ctrl-Z -> Enter right after 'Yes' doesn't stop the input either.

    – John Allison
    Nov 19 '18 at 10:59













  • if cin >> *pchar sets eofbit, it will also set failbit due to failing to read a character, this is explained by the link you posted. The advice to add in a test of !cin.eof() is poor

    – M.M
    Nov 19 '18 at 11:04













  • From here, I think its because the end of the stream (EOF) was encountered while reading the next character (Enter). I'm not quite sure. Follow that link and many others within that, to find out more

    – marvinIsSacul
    Nov 19 '18 at 11:16














1












1








1







Firstly we have to understand what you while loop actually does.



while (cin >> *pchar) pchar++; says that continue getting input from the stdin whilst cin has not encountered an error (or to be specific whilst !cin.fail() == true).



Note that cin is basically an object of std::istream.



Then secondly we have to understand what causes std::istream::fail to return true.
Here they are saying that std::istream::fail returns true if the badbit or failbit flags are set (and/or also if any non EOF error occurs).



Having said that, Ctrl-Z is actually EOF (end of file). And based on what I have said above, std::istream::fail will return true if any none EOF error occurs, and of course return false if an EOF occurs.



So in short, EOF/Ctrl-Z does not cause std::istream::fail to return true hence the loop will continue running.



If you really want to have your program cease executing when EOF/Ctrl-Z gets hit, then adjust your loop to something like this...



 while ((cin >> *pchar) && !cin.eof()) pchar++;


Now the loop above reads, whilst std::istream::fail() == false and no EOF/Ctrl-Z character has been entered, continue looping. Else cease the loop.



I hope that fully answers you.






share|improve this answer















Firstly we have to understand what you while loop actually does.



while (cin >> *pchar) pchar++; says that continue getting input from the stdin whilst cin has not encountered an error (or to be specific whilst !cin.fail() == true).



Note that cin is basically an object of std::istream.



Then secondly we have to understand what causes std::istream::fail to return true.
Here they are saying that std::istream::fail returns true if the badbit or failbit flags are set (and/or also if any non EOF error occurs).



Having said that, Ctrl-Z is actually EOF (end of file). And based on what I have said above, std::istream::fail will return true if any none EOF error occurs, and of course return false if an EOF occurs.



So in short, EOF/Ctrl-Z does not cause std::istream::fail to return true hence the loop will continue running.



If you really want to have your program cease executing when EOF/Ctrl-Z gets hit, then adjust your loop to something like this...



 while ((cin >> *pchar) && !cin.eof()) pchar++;


Now the loop above reads, whilst std::istream::fail() == false and no EOF/Ctrl-Z character has been entered, continue looping. Else cease the loop.



I hope that fully answers you.







share|improve this answer














share|improve this answer



share|improve this answer








edited Nov 19 '18 at 11:00

























answered Nov 19 '18 at 10:05









marvinIsSaculmarvinIsSacul

53717




53717













  • Thanks - it's almost clear now. So turning back to my sequence that worked (Enter - Ctrl-Z - Enter), what exactly causes cin.fail() get to true?

    – John Allison
    Nov 19 '18 at 10:51













  • that sequence worked with you old code?

    – marvinIsSacul
    Nov 19 '18 at 10:55











  • It did, yes. Typing, e.g., 'Yes', then Enter, Ctrl-Z, Enter stops the input and has 3 as an output, so works just fine. Moreover, I just noted that adding !cin.eof() in the condition doesn't help. Pressing Ctrl-Z -> Enter right after 'Yes' doesn't stop the input either.

    – John Allison
    Nov 19 '18 at 10:59













  • if cin >> *pchar sets eofbit, it will also set failbit due to failing to read a character, this is explained by the link you posted. The advice to add in a test of !cin.eof() is poor

    – M.M
    Nov 19 '18 at 11:04













  • From here, I think its because the end of the stream (EOF) was encountered while reading the next character (Enter). I'm not quite sure. Follow that link and many others within that, to find out more

    – marvinIsSacul
    Nov 19 '18 at 11:16



















  • Thanks - it's almost clear now. So turning back to my sequence that worked (Enter - Ctrl-Z - Enter), what exactly causes cin.fail() get to true?

    – John Allison
    Nov 19 '18 at 10:51













  • that sequence worked with you old code?

    – marvinIsSacul
    Nov 19 '18 at 10:55











  • It did, yes. Typing, e.g., 'Yes', then Enter, Ctrl-Z, Enter stops the input and has 3 as an output, so works just fine. Moreover, I just noted that adding !cin.eof() in the condition doesn't help. Pressing Ctrl-Z -> Enter right after 'Yes' doesn't stop the input either.

    – John Allison
    Nov 19 '18 at 10:59













  • if cin >> *pchar sets eofbit, it will also set failbit due to failing to read a character, this is explained by the link you posted. The advice to add in a test of !cin.eof() is poor

    – M.M
    Nov 19 '18 at 11:04













  • From here, I think its because the end of the stream (EOF) was encountered while reading the next character (Enter). I'm not quite sure. Follow that link and many others within that, to find out more

    – marvinIsSacul
    Nov 19 '18 at 11:16

















Thanks - it's almost clear now. So turning back to my sequence that worked (Enter - Ctrl-Z - Enter), what exactly causes cin.fail() get to true?

– John Allison
Nov 19 '18 at 10:51







Thanks - it's almost clear now. So turning back to my sequence that worked (Enter - Ctrl-Z - Enter), what exactly causes cin.fail() get to true?

– John Allison
Nov 19 '18 at 10:51















that sequence worked with you old code?

– marvinIsSacul
Nov 19 '18 at 10:55





that sequence worked with you old code?

– marvinIsSacul
Nov 19 '18 at 10:55













It did, yes. Typing, e.g., 'Yes', then Enter, Ctrl-Z, Enter stops the input and has 3 as an output, so works just fine. Moreover, I just noted that adding !cin.eof() in the condition doesn't help. Pressing Ctrl-Z -> Enter right after 'Yes' doesn't stop the input either.

– John Allison
Nov 19 '18 at 10:59







It did, yes. Typing, e.g., 'Yes', then Enter, Ctrl-Z, Enter stops the input and has 3 as an output, so works just fine. Moreover, I just noted that adding !cin.eof() in the condition doesn't help. Pressing Ctrl-Z -> Enter right after 'Yes' doesn't stop the input either.

– John Allison
Nov 19 '18 at 10:59















if cin >> *pchar sets eofbit, it will also set failbit due to failing to read a character, this is explained by the link you posted. The advice to add in a test of !cin.eof() is poor

– M.M
Nov 19 '18 at 11:04







if cin >> *pchar sets eofbit, it will also set failbit due to failing to read a character, this is explained by the link you posted. The advice to add in a test of !cin.eof() is poor

– M.M
Nov 19 '18 at 11:04















From here, I think its because the end of the stream (EOF) was encountered while reading the next character (Enter). I'm not quite sure. Follow that link and many others within that, to find out more

– marvinIsSacul
Nov 19 '18 at 11:16





From here, I think its because the end of the stream (EOF) was encountered while reading the next character (Enter). I'm not quite sure. Follow that link and many others within that, to find out more

– marvinIsSacul
Nov 19 '18 at 11:16


















draft saved

draft discarded




















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53371127%2fwhile-cin-pchar-awaits-further-input-after-ctrl-z%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







這個網誌中的熱門文章

Xamarin.form Move up view when keyboard appear

Post-Redirect-Get with Spring WebFlux and Thymeleaf

Anylogic : not able to use stopDelay()