尽管同时使用 cin.clear() 和 cin.ignore(),但 Cin 不会暂停输入
Cin doesn't pause for input, despite using both cin.clear() and cin.ignore()
此输入从文件重定向到 unix 终端中的可执行文件:
10 1 2 3 4 5 6 7 8 9 10
5 10 20 30 40 50
Cin 不等待输入,即使它似乎处于良好的状态。
int main(void) {
std::cout << "GOOD: " << std::cin.good() << std::endl
<< "EOF: " << std::cin.eof() << std::endl
<< "FAIL: " << std::cin.fail() << std::endl
<< "BAD: " << std::cin.bad() << "\n\n";
int s;
while(std::cin >> s) {
int * arr = new int[s];
for(int i = 0; i < s; i++) {
std::cin >> arr[i];
std::cout << arr[i] << " ";
}
std::cout << "\n\n";
delete[] arr;
}
std::cout << "CAN READ: " << (bool)(std::cin >> s) << std::endl
<< "GOOD: "<< std::cin.good() << std::endl
<< "EOF: "<< std::cin.eof() << std::endl
<< "FAIL: "<< std::cin.fail() << std::endl
<< "BAD: "<< std::cin.bad() << "\n\n";
std::cin.clear();
std::cin.ignore(INT_MAX);
std::cout << "GOOD: " << std::cin.good() << std::endl
<< "EOF: " << std::cin.eof() << std::endl
<< "FAIL: " << std::cin.fail() << std::endl
<< "BAD: " << std::cin.bad() << "\n\n";
std::cin.clear();
std::cout << "GOOD: " << std::cin.good() << std::endl
<< "EOF: " << std::cin.eof() << std::endl
<< "FAIL: " << std::cin.fail() << std::endl
<< "BAD: " << std::cin.bad() << "\n\n";
std::cout << "Enter a #:\n";
std::cin >> s; // unable to provide input (EDIT: from keyboard) here
std::cout << s << std::endl;
std::cout << "Program ends.\n";
return 0;
}
输出为
GOOD: 1
EOF: 0
FAIL: 0
BAD: 0
1 2 3 4 5 6 7 8 9 10
10 20 30 40 50
CAN READ: 0
GOOD: 0
EOF: 1
FAIL: 1
BAD: 0
GOOD: 0
EOF: 1
FAIL: 0
BAD: 0
GOOD: 1
EOF: 0
FAIL: 0
BAD: 0
Enter a #:
5
Program ends.
我在这里错过了什么?为什么 cin 不允许我向它提供输入,即使它的缓冲区是空的并且流处于良好状态?我该怎么做才能让 cin 在这里接受进一步的输入?
认为在将文件重定向到 cin 后可以无缝地获取键盘输入(感谢 Artemy Vysotsky 帮助我意识到情况并非如此)。
对于有类似问题的任何人,可以使用std::cin.rdbuf()。详情在这里:Can std::cin switch from accepting file input to keyboard input at run-time?
使用cin.flush();输入一个整数后。它将刷新流,您可以再次输入字符串。
如果你想知道为什么会这样,你可以阅读 here
此输入从文件重定向到 unix 终端中的可执行文件:
10 1 2 3 4 5 6 7 8 9 10
5 10 20 30 40 50
Cin 不等待输入,即使它似乎处于良好的状态。
int main(void) {
std::cout << "GOOD: " << std::cin.good() << std::endl
<< "EOF: " << std::cin.eof() << std::endl
<< "FAIL: " << std::cin.fail() << std::endl
<< "BAD: " << std::cin.bad() << "\n\n";
int s;
while(std::cin >> s) {
int * arr = new int[s];
for(int i = 0; i < s; i++) {
std::cin >> arr[i];
std::cout << arr[i] << " ";
}
std::cout << "\n\n";
delete[] arr;
}
std::cout << "CAN READ: " << (bool)(std::cin >> s) << std::endl
<< "GOOD: "<< std::cin.good() << std::endl
<< "EOF: "<< std::cin.eof() << std::endl
<< "FAIL: "<< std::cin.fail() << std::endl
<< "BAD: "<< std::cin.bad() << "\n\n";
std::cin.clear();
std::cin.ignore(INT_MAX);
std::cout << "GOOD: " << std::cin.good() << std::endl
<< "EOF: " << std::cin.eof() << std::endl
<< "FAIL: " << std::cin.fail() << std::endl
<< "BAD: " << std::cin.bad() << "\n\n";
std::cin.clear();
std::cout << "GOOD: " << std::cin.good() << std::endl
<< "EOF: " << std::cin.eof() << std::endl
<< "FAIL: " << std::cin.fail() << std::endl
<< "BAD: " << std::cin.bad() << "\n\n";
std::cout << "Enter a #:\n";
std::cin >> s; // unable to provide input (EDIT: from keyboard) here
std::cout << s << std::endl;
std::cout << "Program ends.\n";
return 0;
}
输出为
GOOD: 1
EOF: 0
FAIL: 0
BAD: 0
1 2 3 4 5 6 7 8 9 10
10 20 30 40 50
CAN READ: 0
GOOD: 0
EOF: 1
FAIL: 1
BAD: 0
GOOD: 0
EOF: 1
FAIL: 0
BAD: 0
GOOD: 1
EOF: 0
FAIL: 0
BAD: 0
Enter a #:
5
Program ends.
我在这里错过了什么?为什么 cin 不允许我向它提供输入,即使它的缓冲区是空的并且流处于良好状态?我该怎么做才能让 cin 在这里接受进一步的输入?
认为在将文件重定向到 cin 后可以无缝地获取键盘输入(感谢 Artemy Vysotsky 帮助我意识到情况并非如此)。
对于有类似问题的任何人,可以使用std::cin.rdbuf()。详情在这里:Can std::cin switch from accepting file input to keyboard input at run-time?
使用cin.flush();输入一个整数后。它将刷新流,您可以再次输入字符串。 如果你想知道为什么会这样,你可以阅读 here