C++循环I/O问题

C++ looping I/O issue

本文关键字:问题 循环 C++      更新时间:2023-10-16
int main(int argc, char *argv[]) {
    while (true) {
        std::cout << "Enter command (with arguments) to profile: ";
        std::string command;
        std::cin >> command;
        std::cout << "Running command: " << command << std::endl;
        Process::create(true, command);
    }
}

这应该不是一个困难的问题,但我是一个初学者C++程序员。我有以下代码,它们应该无休止地循环,提示并接受用户输入。然后,它将输入作为我在其他地方创建的函数的命令运行。

问题是,在输入第一个命令后,输出由Process::create方法打印,当循环返回时,它使用打印的数据,而不是接受我自己的输入。我做错了什么?我想我可能需要刷新cin流或其他什么,但我不知道。

下面是一个示例输出来演示我的问题:

Enter command (with arguments) to profile: ls
Running command: ls
Enter command (with arguments) to profile: homework8      Homework8.cpp~  Process.cpp~    stats.dat
Homework8      plot_stats.gnu  Process.h       TestProgram.cpp
Homework8.cpp  Process.cpp     ProcessStats.h

使用std::getline从流中获取字符串,而不是std::cin>>命令;

std::string command;
std::getline(std::cin, command);

或者在从流获取之前需要检查std::cin

using std::cin;
using std::getline;
char line[MAX_LINE];    /* Line buffer */
while(true)
{
    /* Get command */
    cout << "viettuan@shell:~$ ";
    if (!cin)
        cin.clear();
    else
        cin.getline(line, MAX_LINE);
    //... Do process here
}

使用std::getline获取整行。执行std::cin >> command;会在第一个空白处停止,所以如果您输入一个带有参数的命令,那么您将对该行进行多次循环迭代。

while ( std::getline(std::cin, command ) 
{
    std::cout << "Running command: " << command << std::endl;
    Process::create(true, command);
}
// getting here means they closed stdin
int main(int argc, char *argv[]) {
    while (true) {
        std::cout << "Enter command (with arguments) to profile: ";
        std::string command;
        std::cin >> command;
        std::cout << "Running command: " << command << std::endl;
        Process::create(true, command);
        std::cin.clear();
        std::cin.sync();
    }
}