2016-03-10 2 views
0

Я хочу добавить новый выход из баффа в конец файла rst.txt с использованием потока. Моя проблема в том, что каждая новая запись стирает файл.Перенаправить вывод консоли в конец файла C++ using fromstream

#include <iostream> 
    #include <sstream> 
    #include <stdio.h> 
    #include <fstream> 

    using namespace std; 

    int main() 
    { 
     FILE *in; 


     char buff[512]; 




     while(1) 
     { 
      //if(!(in = popen("tcpdump -i wlan0 -e -c 1 -vvv /home/pi/wifi", "r"))) 
      if(!(in = popen(" sudo tcpdump -i wlan0 -e -c 1 'type mgt subtype probe-req' -vvv", "r"))) 
       return 1; 

      fgets(buff, sizeof(buff), in); 

      pclose(in); 

      std::istringstream iss; 

      iss.str(buff); 

      std::string mac_address; 
      std::string signal_strength; 

      std::string info; 
      while(iss >> info) 
      { 
     if(info.find("SA") != std::string::npos) 
        mac_address = info.substr(3); 

       if(info.find("dB") != std::string::npos) 
        signal_strength = info; 


      } 
      ofstream file; 
      file.open("rst.txt"); 
      streambuf* sbuf=cout.rdbuf(); 
      cout.rdbuf(file.rdbuf()); 
      cout<<"file"<< endl; 

      cout << "  ADRESSE MAC  : " << mac_address << "  " ; 
      cout << "  SIGNAL STRENGTH : " << signal_strength << " " << endl; 
     } 

     return 0; 
    } 

Есть ли способ перенаправить вывод в конец файла? Есть ли какой-либо способ лучше, чем в потоке?

+1

http://en.cppreference.com/w/cpp/io/basic_ofstream/open посмотреть на параметр 'mode' – PeterT

+0

' file.open ("rst.txt", std :: ios :: app); 'присоединяется к концу файла – Galik

+0

Почему вы меняете' rdbuf' 'cout'? Вместо этого вы можете использовать 'файл'. – Galik

ответ

1

Для добавления из http://www.cplusplus.com/reference/fstream/ofstream/open/

ofstream file; 
file.open ("rst.txt", std::ofstream::out | std::ofstream::app); 

Update
Чтобы выполнить запрос в комментариях.

Добавить переменную previous_mac_address

[...] 
string previous_mac_address = ""; 
while(1) 
{ 
[...] 

Затем перед печатью сравнить previous_mac_address и mac_address

[...] 
if (previous_mac_address != mac_address) 
{ 
    cout << "  ADRESSE MAC  : " << mac_address << "  " ; 
    cout << "  SIGNAL STRENGTH : " << signal_strength << " " << endl; 
    previous_mac_address = mac_address; 
} 
else 
    cout << ", " << signal_strength << " " << endl; 

[...] 
+0

спасибо @Matteo это работает. У меня есть последний вопрос: есть ли способ поставить все 'signal_strength', которые связаны с одним' mac_address' в одной строке? –

+0

Или просто используйте std :: ios :: out && std :: ios :: app – Jts

+0

@Cyrine Можете ли вы дать мне образец вывода вашей командной строки? – Matteo

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