2016-10-12 2 views
0
//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; 
} 

Когда я пытаюсь скомпилировать это дает мне эту ошибку:Ошибка при выполнении команды оболочки в C++ Ubuntu Linux

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 разные даты, хранящиеся в моем текстовом файле, я могу распечатать значения stockpile[i].datepurchased в цикле for. Он возвращает строку 9oct16, 10oct16 и т. Д., Но когда я пытаюсь использовать команду оболочки, она не компилируется.

+0

В '' grep '<< файл [i] .datepurchased', компилятор не мог понять, что вы имели в виду под '<<'. Я тоже. – v7d8dpo4

ответ

4

Оператор << является оператором потока. Хотя вы можете объединить строки (и c-строки) с ними в потоке (например, cout), это не работает таким образом, фактически не работая над потоком.

Давайте просто принять заявление внутри системного вызова отдельно

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

<< не предназначается, чтобы использовать этот путь без объекта потока на «поток» в.

Что вы можете сделать, хотя это следующие:

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

Это делает несколько вещей.

  • создать std::string для хранения системной команды
  • потому что datepurchased является std::string уже вы можете использовать оператор + на другой с-строках, чтобы объединить их.
  • система ожидает const char* как аргумент.Таким образом, чтобы иметь возможность передать с-строку в функции мы используем c_str() функцию std::string

Вы также можете сократить заявление следующим образом:

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

Поскольку временная std::string будет создана оператором + вы можете получить доступ к своей функции c_str() напрямую.

0

Это неправильно:

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

Ваша потребность объекта stringstream в поток частей команды первой. Или построить команду, используя строку так:

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

cout<<system(command.c_str())<<endl 
0

Ну, ваш компилятор совершенно ясно говорят вам, что это неправильно: Вы пытаетесь использовать оператор потока << с двумя несоответствующими типами, а именно: const char [6] (ака "grep ") и a std::ostream (aka stockpile[i].datepurchased). Вы просто не можете передавать в массивы или строки символов. Это то, что потоки предназначены для STL. Таким образом, один из возможных решений может быть:

std::cout << system((std::string("grep ") + stockpile[i].datepurchased + std::string(" stockdatabase.txt")).c_str()) << std::endl; 

не проверял, хотя;)

Смежные вопросы