在 C++ 中使用 unix shell 中的文本文件时,如何要求用户输入?
How can you ask for user input when also using a text file in unix shell in c++?
我 运行 我的代码使用 a.out < file.txt
并且当我尝试使用 cin >> variable
询问用户输入时我阅读了所有文件它什么也没做。
当您使用 a.out < file.txt
调用您的程序时,您要求 shell 将 file.txt
内容作为 a.out
[=21] 的标准输入=]而不是 让键盘提供标准输入。如果这不适合你,那么添加一个命令行参数来指定文件名,使用 ifstream
打开它并从中读取而不是 cin
,使用 cin
作为键盘输入。
例如:
int main(int argc, const char* argv[])
{
if (argc != 2)
{
std::cerr << "usage: " << argv[0] << " <filename>\n";
exit(1);
}
const char* filename = argv[1];
if (std::ifstream in(filename))
{
// process the file content, e.g.
std::string line;
while (getline(in, line))
std::cout << "read '" << line << "'\n";
}
else
{
std::cerr << "unable to open \"" << filename << "\"\n";
exit(1);
}
// can still read from std::cin down here...
}
如果您在标准输入后需要额外的用户输入,您必须打开名为“/dev/tty”的控制终端。示例:
#include <iostream>
#include <fstream>
using namespace std;
int main(int argc, char *argv[])
{
ifstream tin("/dev/tty");
ofstream tout("/dev/tty");
tin.tie(&tout);
while (true) {
string input;
tout << "> ";
getline(tin, input);
if (input == "quit")
break;
}
return 0;
}
为了说服自己上面不会读取重定向的文件,一个简单的测试:
$ echo "quit" | ./a.out
>
我 运行 我的代码使用 a.out < file.txt
并且当我尝试使用 cin >> variable
询问用户输入时我阅读了所有文件它什么也没做。
当您使用 a.out < file.txt
调用您的程序时,您要求 shell 将 file.txt
内容作为 a.out
[=21] 的标准输入=]而不是 让键盘提供标准输入。如果这不适合你,那么添加一个命令行参数来指定文件名,使用 ifstream
打开它并从中读取而不是 cin
,使用 cin
作为键盘输入。
例如:
int main(int argc, const char* argv[])
{
if (argc != 2)
{
std::cerr << "usage: " << argv[0] << " <filename>\n";
exit(1);
}
const char* filename = argv[1];
if (std::ifstream in(filename))
{
// process the file content, e.g.
std::string line;
while (getline(in, line))
std::cout << "read '" << line << "'\n";
}
else
{
std::cerr << "unable to open \"" << filename << "\"\n";
exit(1);
}
// can still read from std::cin down here...
}
如果您在标准输入后需要额外的用户输入,您必须打开名为“/dev/tty”的控制终端。示例:
#include <iostream>
#include <fstream>
using namespace std;
int main(int argc, char *argv[])
{
ifstream tin("/dev/tty");
ofstream tout("/dev/tty");
tin.tie(&tout);
while (true) {
string input;
tout << "> ";
getline(tin, input);
if (input == "quit")
break;
}
return 0;
}
为了说服自己上面不会读取重定向的文件,一个简单的测试:
$ echo "quit" | ./a.out
>