Kommt nur murks raus



  • Also das Zeug kommt aus dem /proc/net/dev ordner und davon sollen nun die einzelnen werte Ausgegeben werden!

    D.h. z.B. eth0 bytes: 35622381
    Wenns nun aber nur die ersten Zahlen wären wäre das ja einfach. 🙂 Allerdings soll ich jede Zahl in der reihe einzelnt Ausgeben. D.h. so:
    eth0
    bytes: 35622381
    packets: 67351
    errs: 0
    drop: 0
    fifo: 0
    .
    .
    .
    Das ganze für alle drei lo, wlan und eth0.
    Im Prinzip gebe ich ja nur int werte aus. Ich weiß zwar noch nicht genau wie das geht. Habe aber zu dem Thema gelesen das man das ganz in einen Vektor speichert und dann mit iteratoren irgendwie auf die einzelnen Zeilen stellen zugreifen kann.
    Falls jemand dazu eine gute Seite hat zum lesen würde mich freuen oder aus such Tipps für google würden mir sehr helfen.

    Inter-|   Receive                                                |  Transmit
     face |bytes    packets errs drop fifo frame compressed multicast|bytes    packets errs drop fifo colls carrier compressed
        lo:  870793    2905    0    0    0     0          0         0   870793    2905    0    0    0     0       0          0
     wlan0:       0       0    0    0    0     0          0         0        0       0    0    0    0     0       0          0
      [b]eth0: 35622381[/b]   67351    0    0    0     0          0      2081  9387280   58744    0    0    0     0       0          0
    


  • Siehe mein Beispiel, und ersetze std::string durch std::vector<char>. Fertig.



  • EDIT Fehler gefunden



  • Suchst du sowas?

    #include <iostream>
    #include <fstream>
    #include <iterator>
    #include <string>
    #include <vector>
    using namespace std;
    
    struct face
    {
    	string name;
    
    	unsigned bytes_received;
    	unsigned packets_received;
    	unsigned errs_received;
    	unsigned drop_received;
    	unsigned fifo_received;
    	unsigned frame_received;
    	unsigned compressed_received;
    	unsigned multicast_received;
    
    	unsigned bytes_transmitted;
    	unsigned packets_transmitted;
    	unsigned errs_transmitted;
    	unsigned drop_transmitted;
    	unsigned fifo_transmitted;
    	unsigned colls_transmitted;
    	unsigned carrier_transmitted;
    	unsigned compressed_transmitted;
    };
    
    istream& skip_line(istream& in)
    {
    	return in.ignore(numeric_limits<streamsize>::max(),'\n');
    }
    
    istream& operator>>(istream& in, face& f)
    {
    	return in
    		>> f.name
    		>> f.bytes_received >> f.packets_received >> f.errs_received >> f.drop_received >> f.fifo_received >> f.frame_received >> f.compressed_received >> f. multicast_received
    		>> f.bytes_transmitted >> f.packets_transmitted >> f.errs_transmitted >> f.drop_transmitted >> f.fifo_transmitted >> f.colls_transmitted >> f.carrier_transmitted >> f.compressed_transmitted;
    }
    
    ostream& operator<<(ostream& out, const face& f)
    {
    	return out
    		<< f.name << "|"
    		<< f.bytes_received    << "|" << f.packets_received    << "|" << f.errs_received       << "|" << f.drop_received       << "|"
    		<< f.fifo_received     << "|" << f.frame_received      << "|" << f.compressed_received << "|" << f. multicast_received << "|"
    		<< f.bytes_transmitted << "|" << f.packets_transmitted << "|" << f.errs_transmitted    << "|" << f.drop_transmitted    << "|"
    		<< f.fifo_transmitted  << "|" << f.colls_transmitted   << "|" << f.carrier_transmitted << "|" << f.compressed_transmitted;
    }
    
    void read_dev(vector<face>& dev)
    {
    	ifstream file("test.txt");
    	file >> skip_line; // Überspringe erste Zeile.
    	file >> skip_line; // Überspringe zweite Zeile.
    	for(face f; file>>f; dev.push_back(f));
    }
    
    void table(vector<face>& dev)
    {
    	for(vector<face>::iterator it=dev.begin(); it!=dev.end(); ++it)
    		cout << '\n' << *it;
    }
    
    int main()
    {
    	vector<face> dev;
    	read_dev(dev);
    	table(dev);
    }
    


  • wow das sieht gut aus 😃

    Ich arbeite das mal durch damit ich weiß was abgeht! Meld mich dann morgen wenn irgendwas ist!

    LG Enno



  • out schrieb:

    istream& skip_line(istream& in)
    {
    	return in.ignore(numeric_limits<streamsize>::max(),'\n');
    }
    

    Frage ist was macht diese Funktion? und woher kommt das numeric_limits<streamsize>::max()?

    LG Enno



  • Enno schrieb:

    out schrieb:

    istream& skip_line(istream& in)
    {
    	return in.ignore(numeric_limits<streamsize>::max(),'\n');
    }
    

    Frage ist was macht diese Funktion? und woher kommt das numeric_limits<streamsize>::max()?

    Diese Funktion verwirft alle Zeichen bis zum nächsten Zeilenumbruch. Aso ja, du musst noch #include <limits> oben hinschreiben.



  • Ah! Jo mit dem include geht es dann, vielen dank!

    Hab trotzdem noch eine Frage. 🙄 Kann ich mir mit einer getBla Funktion nun auch die einzelnen Sachen holen? Also meinte wegen die packets_received?

    LG Enno



  • Enno schrieb:

    Ah! Jo mit dem include geht es dann, vielen dank!

    Hab trotzdem noch eine Frage. 🙄 Kann ich mir mit einer getBla Funktion nun auch die einzelnen Sachen holen? Also meinte wegen die packets_received

    Klar, du musst einfach nur dev[0].packets_received; schreiben.



  • Mhm... Was mach ich Falsch?

    unsigned getPackets(vector<face>& dev){
      return dev[0].packets_received;  
    }
    
    int main(){ 
      vector<face> dev; 
      read_dev(dev); 
      table(dev); 
      getPackets(dev);
    }
    

    LG Enno

    EDIT: ... ich dummerle 😃

    cout
    

    vllcht^^



  • mein Gott ...



  • Belli schrieb:

    mein Gott ...

    🙄 Noch so früh



  • Ich nehme mal an, du willst alle packets_received:

    #include <utility>
    
    vector<pair<string,unsigned>> packets_received_all(const vector<face>& dev)
    {
    	vector<pair<string,unsigned>> packets_received;
    	for(vector<face>::const_iterator it=dev.begin(); it!=dev.end(); ++it)
    		packets_received.push_back( make_pair(it->name,it->packets_received) );
    	return packets_received;
    
    }
    
    int main()
    {
        vector<face> dev;
        read_dev(dev);
        table(dev);
    	vector<pair<string,unsigned>> packets_received = packets_received_all(dev);
    
    	cout << endl << packets_received[0].first << ' ' << packets_received[0].second;
    	cout << endl << packets_received[2].first << ' ' << packets_received[2].second;
    }
    


  • out schrieb:

    Ich nehme mal an, du willst alle packets_received:

    #include <utility>
    
    vector<pair<string,unsigned>> packets_received_all(const vector<face>& dev)
    {
    	vector<pair<string,unsigned>> packets_received;
    	for(vector<face>::const_iterator it=dev.begin(); it!=dev.end(); ++it)
    		packets_received.push_back( make_pair(it->name,it->packets_received) );
    	return packets_received;
    
    }
    
    int main()
    {
        vector<face> dev;
        read_dev(dev);
        table(dev);
    	vector<pair<string,unsigned>> packets_received = packets_received_all(dev);
    
    	cout << endl << packets_received[0].first << ' ' << packets_received[0].second;
    	cout << endl << packets_received[2].first << ' ' << packets_received[2].second;
    }
    

    Mhm das wäre auch eine Überlegung.
    Mir reicht aber die einfach getPackets erstmal. 🙂

    Ich kann den ganzen Kram doch jetzt auch noch als Klasse machen oder? Frage ist wo dann skip_line und die beiden Operatoren Teile hinkommen in die .h??



  • Enno schrieb:

    Mhm das wäre auch eine Überlegung.
    Mir reicht aber die einfach getPackets erstmal. 🙂

    Ich kann den ganzen Kram doch jetzt auch noch als Klasse machen oder? Frage ist wo dann skip_line und die beiden Operatoren Teile hinkommen in die .h??

    Scheint, als würde es am Ende auf eine Datenbank hinauslaufen... Wenn du mal das mal dies abfragen willst, mal einzeln, mal alles mal nur ein paar bestimmte. Ja ich würde jetzt alles mal in eine Klasse packen, bis auf operator<<, operator>> und skip_line, die bleiben freie Funktionen und bekommen eine extra Header und Cpp-File.



  • Das versteh ich nun nicht ganz.
    Ich hab also meine 3 Dateien: .h .cpp .cpp
    Jetzt soll ich mir für operator<< operator>> und skip_line noch eine extra .h schreiben + extra .cpp?
    Muss die dann in meine .cpp(nicht main) mit #include "operator.h" rein oder wo inculdieren?



  • Enno schrieb:

    Das versteh ich nun nicht ganz.
    Ich hab also meine 3 Dateien: .h .cpp .cpp
    Jetzt soll ich mir für operator<< operator>> und skip_line noch eine extra .h schreiben + extra .cpp?
    Muss die dann in meine .cpp(nicht main) mit #include "operator.h" rein oder wo inculdieren?

    Ich würde das irgendwie so machen:

    1. Du erstellst eine Klasse class manage_dev { ..... }; . Dann hast du eine manage_dev.cpp und eine manage_dev.h
    2. Dann hast du die Input/Output Funktionen. Dafür erstellst du eine io.h und eine io.cpp .
    3. In der io.cpp inkludierst du dann manage_dev.h und in der io.h reicht eine Forwärtsdeklaration class manage_dev;
    4. In der main.cpp inkludierst du dann manage_dev.h und io.h .

    Ich hoffe, ich hab jetzt auf die Schnelle nichts durcheinander gebracht.



  • Oh je ...
    Also ich bin grade am basteln und es scheint fast fertig.
    Jedoch weiß ich nicht ob die io.h und io.cpp so richtig sind:

    .cpp

    #include <iostream>
    #include <string>
    #include <fstream>
    #include <vector> 
    #include <iterator> 
    #include <limits>
    #include <utility>
    
    #include "sysinfo.h"
    
    std::istream& SYSInfo::skip_line(std::istream& in){ 
      return in.ignore(std::numeric_limits<std::streamsize>::max(),'\n'); 
    }
    
    std::istream& SYSInfo::operator>>(std::istream& in, face& f){ 
      return in 
      >> f.name 
      >> f.bytes_received >> f.packets_received >> f.errs_received >> f.drop_received >> f.fifo_received >> f.frame_received >> f.compressed_received >> f. multicast_received         >> f.bytes_transmitted >> f.packets_transmitted >> f.errs_transmitted >> f.drop_transmitted >> f.fifo_transmitted >> f.colls_transmitted >> f.carrier_transmitted >> f.compressed_transmitted; 
    }
    
    std::ostream& SYSInfo::operator<<(std::ostream& out, const face& f){ 
      return out 
      << f.name << "Bytes: " 
      << f.bytes_received    << " Packets: " << f.packets_received    << " Errs: " << f.errs_received       << " Drop: " << f.drop_received       << " Fifo: " 
      << f.fifo_received     << " Frame: " << f.frame_received      << " Compressed: " << f.compressed_received << " Multicast: " << f. multicast_received << " Bytes: " 
      << f.bytes_transmitted << " Packets: " << f.packets_transmitted << " Errs: " << f.errs_transmitted    << " Drop: " << f.drop_transmitted    << " Fifo: " 
      << f.fifo_transmitted  << " Coll: " << f.colls_transmitted   << " Carrier: " << f.carrier_transmitted << " Compressed: " << f.compressed_transmitted; 
    }
    

    Also die .h ist sicher falsch denke ich 😞

    #include <iostream>
    #include <string>
    #include <fstream>
    #include <vector> 
    #include <iterator> 
    #include <limits>
    #include <utility>
    
    #ifndef OH_H
    #define OH_H
    
    std::istream& skip_line(std::istream& in);
    
    std::istream& operator>>(std::istream& in, face& f);
    
    std::ostream& operator<<(std::ostream& out, const face& f);
    
    #endif
    

    Ich denke das hier ist auch noch wichtig aus der sysinfo.cpp:

    #include <fstream>
    #include <string>
    #include <iostream>
    #include <vector> 
    #include <iterator> 
    #include <limits>
    #include <utility>
    
    #include "sysinfo.h"
    
    //#ifdef POSIX
    
    using namespace exsystem; 
    using namespace std;
    
    void SYSInfo::read_dev(vector<face>& dev){ 
      ifstream file("/proc/net/dev"); 
      file >> skip_line; // Überspringe erste Zeile. 
      file >> skip_line; // Überspringe zweite Zeile. 
      for(face f; file>>f; dev.push_back(f)); 
    } 
    
    void SYSInfo::table(vector<face>& dev){ 
      for(vector<face>::iterator it=dev.begin(); it!=dev.end(); ++it) 
        cout << '\n' << *it << '\n'; 
    } 
    
    unsigned SYSInfo::getPackets(vector<face>& dev){
      return dev[2].packets_received;  
    }
    
    vector<pair<string,unsigned> > SYSInfo::packets_received_all(const vector<face>& dev){
      vector<pair<string,unsigned> > packets_received; 
      for(vector<face>::const_iterator it=dev.begin(); it!=dev.end(); ++it) 
        packets_received.push_back( make_pair(it->name,it->packets_received) ); 
      return packets_received;
    }
    

    Meine Compiler Fehler dazu:

    sysinfo.h:56:8: Fehler: zusätzliche Qualifizierung »exsystem::SYSInfo::« an Element »read_dev« [-fpermissive]
    sysinfo.h:57:8: Fehler: zusätzliche Qualifizierung »exsystem::SYSInfo::« an Element »table« [-fpermissive]
    sysinfo.h:58:12: Fehler: zusätzliche Qualifizierung »exsystem::SYSInfo::« an Element »getPackets« [-fpermissive]
    sysinfo.cpp: In Elementfunktion »void exsystem::SYSInfo::read_dev(std::vector<exsystem::SYSInfo::face>&)«:
    sysinfo.cpp:41:11: Fehler: »skip_line« wurde in diesem Gültigkeitsbereich nicht definiert
    sysinfo.cpp:43:21: Fehler: keine Übereinstimmung für »operator>>« in »file >> f«
    sysinfo.cpp:43:21: Anmerkung: Kandidaten sind:
    

    Warum zusätzliche Qualifizierung und was ist auf einmal mit skip_line los?

    LG Enno



  • Hä?
    Ich hab mir so etwas vorgestellt:

    io.h

    #pragma once // Das brauchst du nicht, ist nur ein VS Bug.
    #ifndef IO_H
    #define IO_H
    
    #include <iostream>
    struct face;
    
    std::istream& skip_line(std::istream& in);
    std::istream& operator>>(std::istream& in, face& f);
    std::ostream& operator<<(std::ostream& out, const face& f);
    
    #endif
    

    io.cpp

    #include "io.h"
    #include "Test.h"
    #include <limits>
    
    std::istream& skip_line(std::istream& in){
      return in.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
    }
    
    std::istream& operator>>(std::istream& in, face& f){
      return in
      >> f.name
      >> f.bytes_received >> f.packets_received >> f.errs_received >> f.drop_received >> f.fifo_received >> f.frame_received >> f.compressed_received >> f. multicast_received         >> f.bytes_transmitted >> f.packets_transmitted >> f.errs_transmitted >> f.drop_transmitted >> f.fifo_transmitted >> f.colls_transmitted >> f.carrier_transmitted >> f.compressed_transmitted;
    }
    
    std::ostream& operator<<(std::ostream& out, const face& f){
      return out
      << f.name << "Bytes: "
      << f.bytes_received    << " Packets: " << f.packets_received    << " Errs: " << f.errs_received       << " Drop: " << f.drop_received       << " Fifo: "
      << f.fifo_received     << " Frame: " << f.frame_received      << " Compressed: " << f.compressed_received << " Multicast: " << f. multicast_received << " Bytes: "
      << f.bytes_transmitted << " Packets: " << f.packets_transmitted << " Errs: " << f.errs_transmitted    << " Drop: " << f.drop_transmitted    << " Fifo: "
      << f.fifo_transmitted  << " Coll: " << f.colls_transmitted   << " Carrier: " << f.carrier_transmitted << " Compressed: " << f.compressed_transmitted;
    }
    

    sysinfo.h

    #pragma once // Das brauchst du nicht, ist nur ein VS Bug.
    #ifndef SYSInfo_H
    #define SYSInfo_H
    
    #include <string>
    #include <utility>
    #include <vector>
    
    struct face
    {
        std::string name;
    
        unsigned bytes_received;
        unsigned packets_received;
        unsigned errs_received;
        unsigned drop_received;
        unsigned fifo_received;
        unsigned frame_received;
        unsigned compressed_received;
        unsigned multicast_received;
    
        unsigned bytes_transmitted;
        unsigned packets_transmitted;
        unsigned errs_transmitted;
        unsigned drop_transmitted;
        unsigned fifo_transmitted;
        unsigned colls_transmitted;
        unsigned carrier_transmitted;
        unsigned compressed_transmitted;
    };
    
    class SYSInfo
    {
    	private:
    		std::vector<face> dev;
    	public:
    		void read_dev();
    		void table();
    		unsigned getPacket();
    		std::vector< std::pair<std::string,unsigned> > packets_received_all();
    };
    
    #endif
    

    sysinfo.cpp

    #include "sysinfo.h"
    #include "io.h"
    #include <fstream>
    #include <iterator>
    
    void SYSInfo::read_dev()
    {
    	  std::ifstream file("/proc/net/dev");
    	  file >> skip_line; // Überspringe erste Zeile.
    	  file >> skip_line; // Überspringe zweite Zeile.
    	  for(face f; file>>f; dev.push_back(f));
    }
    
    void SYSInfo::table(){
    	  for(std::vector<face>::iterator it=dev.begin(); it!=dev.end(); ++it)
    		std::cout << '\n' << *it << '\n';
    }
    
    unsigned SYSInfo::getPacket(){
    	return dev[2].packets_received;  
    }
    
    std::vector< std::pair<std::string,unsigned> > SYSInfo::packets_received_all(){
    	  std::vector< std::pair<std::string,unsigned> > packets_received;
    	  for(std::vector<face>::iterator it=dev.begin(); it!=dev.end(); ++it)
    		packets_received.push_back( make_pair(it->name,it->packets_received) );
    	  return packets_received;
    }
    

    main.cpp

    #include "sysinfo.h"
    #include <iostream>
    using namespace std;
    
    int main()
    {
    	SYSInfo sys_info;
    
        sys_info.read_dev();
        sys_info.table();
        vector<pair<string,unsigned>> packets_received = sys_info.packets_received_all();
    
        cout << endl << packets_received[0].first << ' ' << packets_received[0].second;
        cout << endl << packets_received[2].first << ' ' << packets_received[2].second;
    
    	cout << endl << sys_info.getPacket();
    }
    


  • Im Prinzip hatte ich es ja so nur die includes waren nicht richtig

    out schrieb:

    io.cpp

    #include "io.h"
    #include "Test.h" // ich denke ich brauch die nicht oder? ansonst was ist das?
    #include <limits>
    
    std::istream& skip_line(std::istream& in){
      return in.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
    }
    
    std::istream& operator>>(std::istream& in, face& f){
      return in
      >> f.name
      >> f.bytes_received >> f.packets_received >> f.errs_received >> f.drop_received >> f.fifo_received >> f.frame_received >> f.compressed_received >> f. multicast_received         >> f.bytes_transmitted >> f.packets_transmitted >> f.errs_transmitted >> f.drop_transmitted >> f.fifo_transmitted >> f.colls_transmitted >> f.carrier_transmitted >> f.compressed_transmitted;
    }
    
    std::ostream& operator<<(std::ostream& out, const face& f){
      return out
      << f.name << "Bytes: "
      << f.bytes_received    << " Packets: " << f.packets_received    << " Errs: " << f.errs_received       << " Drop: " << f.drop_received       << " Fifo: "
      << f.fifo_received     << " Frame: " << f.frame_received      << " Compressed: " << f.compressed_received << " Multicast: " << f. multicast_received << " Bytes: "
      << f.bytes_transmitted << " Packets: " << f.packets_transmitted << " Errs: " << f.errs_transmitted    << " Drop: " << f.drop_transmitted    << " Fifo: "
      << f.fifo_transmitted  << " Coll: " << f.colls_transmitted   << " Carrier: " << f.carrier_transmitted << " Compressed: " << f.compressed_transmitted;
    }
    

    Die beiden .h kommen sich wohl irgendwie in die quere?

    out schrieb:

    sysinfo.cpp

    #include "sysinfo.h"
    #include "io.h" // wenn ich diese rein mache bei mir kennt der alles was ich in sysinfo.h deklariert hab nicht mehr
    #include <fstream>
    #include <iterator>
    
    void SYSInfo::read_dev()
    {
    	  std::ifstream file("/proc/net/dev");
    	  file >> skip_line; // Überspringe erste Zeile.
    	  file >> skip_line; // Überspringe zweite Zeile.
    	  for(face f; file>>f; dev.push_back(f));
    }
    
    void SYSInfo::table(){
    	  for(std::vector<face>::iterator it=dev.begin(); it!=dev.end(); ++it)
    		std::cout << '\n' << *it << '\n';
    }
    
    unsigned SYSInfo::getPacket(){
    	return dev[2].packets_received;  
    }
    
    std::vector< std::pair<std::string,unsigned> > SYSInfo::packets_received_all(){
    	  std::vector< std::pair<std::string,unsigned> > packets_received;
    	  for(std::vector<face>::iterator it=dev.begin(); it!=dev.end(); ++it)
    		packets_received.push_back( make_pair(it->name,it->packets_received) );
    	  return packets_received;
    }
    

    Dieser Fehler ist immer noch da.

    sysinfo.h:52:8: Fehler: zusätzliche Qualifizierung »exsystem::SYSInfo::« an Element »read_dev« [-fpermissive]
    

Anmelden zum Antworten