Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何用C+编写简单而正确的输入管道+; 我一直在寻找C++中的一个简单的输入管道例子。 发现的大多数管道都是旧的unix样式的管道 承认我对管道很不熟悉,我的目的是创建一个C++ Apache日志管道,这样所有日志都可以通过我的程序来传输。我假设最低要求是输入管道_C++ - Fatal编程技术网

如何用C+编写简单而正确的输入管道+; 我一直在寻找C++中的一个简单的输入管道例子。 发现的大多数管道都是旧的unix样式的管道 承认我对管道很不熟悉,我的目的是创建一个C++ Apache日志管道,这样所有日志都可以通过我的程序来传输。我假设最低要求是输入管道

如何用C+编写简单而正确的输入管道+; 我一直在寻找C++中的一个简单的输入管道例子。 发现的大多数管道都是旧的unix样式的管道 承认我对管道很不熟悉,我的目的是创建一个C++ Apache日志管道,这样所有日志都可以通过我的程序来传输。我假设最低要求是输入管道,c++,C++,目前,我的管道如下所示 我已经确定,当运行命令:cat/pathto/access_log |./myfunction时,输出将生成一个类似于:0:1:14httpget-found的输出。 我已经确定管道的输入来自cin,而不是argv,对于专业程序员来说,这可能是一件令人惊讶和琐碎的事情 我现在的问题是,当所有输入都通过管道输入时,程序停止。尝试在终端中键入某些内容似乎有效,但输入似乎被忽略,无法处理 但我的问题是:这是一个正确编写的输入管道吗。如果没有。少了什么 void pipecomm

目前,我的管道如下所示

我已经确定,当运行命令:cat/pathto/access_log |./myfunction时,输出将生成一个类似于:0:1:14httpget-found的输出。 我已经确定管道的输入来自cin,而不是argv,对于专业程序员来说,这可能是一件令人惊讶和琐碎的事情

我现在的问题是,当所有输入都通过管道输入时,程序停止。尝试在终端中键入某些内容似乎有效,但输入似乎被忽略,无法处理

但我的问题是:这是一个正确编写的输入管道吗。如果没有。少了什么

void pipecommand(string strcommand, int &cnt1, int &cnt2, bool flag){

    //Extra code inserted here to handle http log entries
    //-------------

    int loc = strcommand.find("GET");
    if(loc != string::npos)
    {
        if(flag){cnt1++;}
        else{cnt2++;}
        cout << cnt1 << " : " << cnt2 << ": " << loc << " HTTP GET found" << endl;
    }
}

int main(int argc, char *argv[])                
{                                               
    string str_command = "";
    string argument = "";
    bool argument_f = false;
    int counter1 = 0;
    int counter2 = 0;
    bool isArg = false;
    if (argc == 2)
    {
        argument = argv[1];
        argument_f = true;
    }
    while(getline(cin, str_command))  //getline inserted here
    {
        if(argument_f){
            isArg = true;
            pipecommand(argument, counter1, counter2, isArg);
            argument_f = false;
        }
        else{
            //getline(cin, str_command); 
            //Removed and inserted in while

            isArg = false;
            pipecommand(str_command, counter1, counter2, isArg);
        }
    }
    return 0;
}
void pipecommand(字符串strcommand、int&cnt1、int&cnt2、bool标志){
//此处插入的额外代码用于处理http日志条目
//-------------
int loc=strcommand.find(“GET”);
if(loc!=string::npos)
{
if(flag){cnt1++;}
else{cnt2++;}

如果要在管道关闭时使程序退出,请使用
std::getline
的返回值。我相信您想要的实际上与管道无关,而是与输入流有关。无论是否将某些内容通过管道输入到您的程序或直接输入,都不会真正改变您希望在关闭流后退出的状态。请尝试运行您的p无需将
ls
的输出管道输送到程序中即可编程。如果您的程序正在等待输入,将显示一个提示。一旦您关闭该提示(大多数终端上的Control-D),则您希望程序终止。请查看文档。感谢您的评论。我假设如果预期用途是CustomLog“|myfunction”,管道需要保持打开状态并等待更多输入。退出不是问题,但为什么此函数在ls-l命令后不响应终端输入。我写的任何东西…包含根,似乎都不会编译。使用
std::cin
(如@Thomas建议的)。我所需要做的只是
进行编译(std::string-line;std::getline(std::cin,line);){/*…*/}
(其余由OS/shell提供。)要在管道关闭时使程序退出,请使用
std::getline
的返回值。我相信您想要的实际上与管道无关,而是与输入流有关。无论是否有内容通过管道输入到您的程序或直接输入,都不会真正改变您希望在流关闭后退出的状态。请尝试运行您的程序m,而不将
ls
的输出输送到其中。如果您的程序正在等待输入,将显示一个提示。一旦您关闭该提示(大多数终端上的Control-D),则您希望程序终止。请查看文档。感谢您的评论。我假设如果预期用途是CustomLog“| myfunction”,管道需要保持打开状态并等待更多输入。退出不是问题,但为什么此函数在ls-l命令后不响应终端输入。我编写的任何东西…包含根,似乎都无法编译。A using
std::cin
(如@Thomas所建议的)。我只需要为(std::string-line;std::getline(std::cin,line);){/*…*/}
(其余由OS/shell提供。)