在C ++ ubuntu linux中运行shell命令时出错

时间:2016-10-12 07:58:12

标签: c++ linux shell loops ubuntu

//all variables are declared in a struct StockPile
//...
string itemid;    
string itemdesc;  
string datepurchased;
string line;
int unitprice;
int totalsales;
std::string myline;
//...

void displaydailyreport() {

    ifstream myfile("stockdatabase.txt");   

    for(int i=0;std::getline(myfile,myline);i++) 
    {
        // Trying to grep all data with a specific date from a textfile,
        cout<<system("grep "<<stockpile[i].datepurchased<<" stockdatabase.txt")<<endl;
    }   
    cout<<endl; 
}

当我尝试编译时,它给了我这个错误:

note:template argument deduction/substitution failed:
Main.cpp:853:40: note:   mismatched types ‘std::basic_ostream<_CharT, _Traits>’ and ‘const char [6]’
     cout<<system("grep "<<stockpile[i].datepurchased<<" stockdatabase.txt")<<endl;

当我尝试使用它时,它可以正常工作:

 cout<<system("grep '9oct16' stockdatabase.txt")

stockpile[i].datepurchased是我可以cout存储在文本文件中的不同日期的地方,我可以在for循环中打印出stockpile[i].datepurchased个值。     它返回字符串9oct16,10oct16等但是当我尝试使用shell命令时它不会编译。

4 个答案:

答案 0 :(得分:4)

<<运算符是流运算符。虽然您可以在流上(例如cout)将字符串(和c字符串)与它们连接起来,但如果没有实际处理流,它就不会以这种方式工作。

让我们单独在系统调用中使用语句

"grep "<<stockpile[i].datepurchased<<" stockdatabase.txt"

<<并不意味着在没有流对象的情况下以这种方式使用{&#34; stream&#34;成。

您可以做的是以下内容:

std::string command = "grep "
                      + stockpile[i].datepurchased
                      + " stockdatabase.txt"
system(command.c_str());

这可以做几件事。

  • 创建std::string以存储系统命令
  • 因为datepurchased已经是std::string,您可以在其他c字符串上使用+运算符来连接它们。
  • 系统期望const char*作为参数。因此,为了能够将c-string传递给函数,我们使用c_str()
  • std::string函数

您还可以将声明缩短为:

system( ("grep "+stockpile[i].datepurchased+" stockdatabase.txt").c_str());

由于+运算符会创建临时std::string,因此您可以直接访问其c_str()函数。

答案 1 :(得分:0)

<<是附加到流的运算符,它不执行字符串连接。因此,请使用+代替<<来生成grep命令。

http://www.cplusplus.com/reference/string/string/operator+/

http://www.cplusplus.com/reference/string/string/operator%3C%3C/

答案 2 :(得分:0)

这是错误的:

df.printSchema()

您需要一个stringstream对象来首先流式传输命令的各个部分。 或者使用类似的字符串构建命令:

cout<<system("grep "<<stockpile[i].datepurchased<<" stockdatabase.txt")<<endl

答案 3 :(得分:0)

好吧,你的编译器非常明确地告诉你错误:你正在尝试使用带有两个不匹配类型的流运算符com.mysql.jdbc.exceptions.jdbc4.MySQLQueryInterruptedException: Query execution was interrupted ,即<<(又名const char [6] })和"grep "(又名std::ostream)。您根本无法流入char数组或字符串。那是STL中为流程设计的流。因此,一种可能的解决方案可能是:

stockpile[i].datepurchased
但是,没有测试过它;)