Kommt nur murks raus



  • @daddy
    tut mir leid ich weiß was du meinst und habes ja auch geändert ... allerdings soll ich das nicht ändern das wird hier so gemacht frag mich nicht warum ich hab kein plan!!

    @Tachyon
    Ich wollte den kram den in dem Verzeichnis "/proc/net/dev" zurück geben ... geht das so nicht?



  • Enno schrieb:

    [cpp]
    const char *getMaschine();
    [...]
    std::string MachineInfo;[/cpp]

    So ein Mischmasch solltest du prinzipiell meiden. Kann in komplexeren Projekten nur schiefgehen.

    Und mit dem "Kram" meinst du Ordner und Dateien? Dann iteriere über alle Objekte und gib jedes einzeln aus/zurück/was-auch-immer.



  • Enno schrieb:

    SYSInfo::SYSInfo(){
      struct sysinfo *mysys = new struct sysinfo;
      struct utsname myInfo;
      if(sysinfo(mysys)!=-1){
        Totalram=mysys->totalram/1024;
      }
      if (uname(&myInfo) != -1) {
        SysnameInfo=myInfo.sysname;
        ReleaseInfo=myInfo.release;
        NodenameInfo=myInfo.nodename;
        MachineInfo=myInfo.machine;
      }
    }
    
    void *SYSInfo::getUpdateNetworkstat(){ 
      std::ifstream UpdateNetworkstat("/proc/net/dev");
      return UpdateNetworkstat;
    }
    

    Wie heisst eure Anwendung? Glücksrad für Linux?^^

    Machs doch so in der Art: (Fehlerabfragen müsste man noch einbauen)

    #include <iostream>
    #include <fstream>
    #include <vector>
    using namespace std;
    
    class EineKlasse
    {
    
            private:
                      vector<char>Data;
            public:
                      void getUpdateNetworkstat ( string filename );
                      void PrintNetworkstat();
    };
    
    void EineKlasse :: getUpdateNetworkstat ( string filename )
    {
    ifstream file( filename.c_str() );
    
                file.seekg(0,ios::end);
    long size = file.tellg();
                file.seekg(0,ios::beg);
    
                Data.resize( size + 1);
                file.read(&Data[0],size );
    
                Data[size]='\x00';  // Nullterminator anhängen, sonst gibt cout lustige ASCII Zeichen mit aus
    }
    
    void EineKlasse :: PrintNetworkstat ()
    {
            cout<<&Data[0]<<endl;
    }
    
    int main()
    {
    
    EineKlasse abc;
    
    abc.getUpdateNetworkstat( "test.txt" );
    abc.PrintNetworkstat();
    
    return 0;
    }
    


  • Korrigiere wenn ich mich irre, aber damit bist du im ungültigen Bereich:

    Data[size]='\x00';
    

    Daher

    Data.resize(size+1)
    


  • Oops ja stimmt, mein Fehler habs oben korrigiert.



  • Enno schrieb:

    @Tachyon
    Ich wollte den kram den in dem Verzeichnis "/proc/net/dev" zurück geben ... geht das so nicht?

    /proc/net/dev ist unter Linux aber kein Verzeichnis. Bitte informiere dich doch einfach erstmal, bevor du wild irgendeinen Unsinn durch den Compiler jagst. Mit proc(5) (einfach "man 5 proc" auf der Konsole eingeben) könntest du anfangen.

    Ein Buch über C++ und Unix/Linux wäre aber auch nicht verkehrt. "The Linux Programming Interface" von Michael Kerrisk ist hier ein recht umfassendes und dennoch aktuelles Buch von ordentlicher Qualität.



  • also wenn ich bei mir cat /proc/net/dev eingebe zeigt der mir das hier an:

    Inter-|   Receive                                                |  Transmit
     face |bytes    packets errs drop fifo frame compressed multicast|bytes    packets errs drop fifo colls carrier compressed
        lo:   78345     251    0    0    0     0          0         0    78345     251    0    0    0     0       0          0
     wlan0:       0       0    0    0    0     0          0         0        0       0    0    0    0     0       0          0
      eth0: 6131451    9365    0    0    0     0          0      2522   552388    4420    0    0    0     0       0          0
    

    d.h. doch dann wohl das das ein verzeichnis ist was ich auslesen kann? oder verstehe ich da etwas kommplett falsch?

    /proc/net/dev
                  The  dev  pseudo-file contains network device status information.  This gives the number of received and sent pack‐
                  ets, the number of errors and collisions and other basic statistics.  These are used by the ifconfig(8) program  to
                  report device status.
    

  • Mod

    Wie viele Verzeichnisse kennst du, die man mit cat ausgeben kann und die auf der zugehörigen Manpage "pseudo-file" genannt werden?

    Ich glaube, HepSepp hat vollkommen recht. Wie viel sollen wir dir eigentlich noch helfen, wenn du die Antworten wegen mangelndem Hintergrundwissen doch nicht verstehst? Zumal dir in schon mehreren Threads Quasi-Komplettlösungen gegeben wurden, die du nicht als solche erkannt hast (siehe vorherige Bemerkung über Verstehen der Antworten).



  • Bassmaster schrieb:

    Enno schrieb:

    SYSInfo::SYSInfo(){
      struct sysinfo *mysys = new struct sysinfo;
      struct utsname myInfo;
      if(sysinfo(mysys)!=-1){
        Totalram=mysys->totalram/1024;
      }
      if (uname(&myInfo) != -1) {
        SysnameInfo=myInfo.sysname;
        ReleaseInfo=myInfo.release;
        NodenameInfo=myInfo.nodename;
        MachineInfo=myInfo.machine;
      }
    }
    
    void *SYSInfo::getUpdateNetworkstat(){ 
      std::ifstream UpdateNetworkstat("/proc/net/dev");
      return UpdateNetworkstat;
    }
    

    Wie heisst eure Anwendung? Glücksrad für Linux?^^

    Machs doch so in der Art: (Fehlerabfragen müsste man noch einbauen)

    #include <iostream>
    #include <fstream>
    #include <vector>
    using namespace std;
    
    class EineKlasse
    {
    
            private:
                      vector<char>Data;
            public:
                      void getUpdateNetworkstat ( string filename );
                      void PrintNetworkstat();
    };
    
    void EineKlasse :: getUpdateNetworkstat ( string filename )
    {
    ifstream file( filename.c_str() );
    
                file.seekg(0,ios::end);
    long size = file.tellg();
                file.seekg(0,ios::beg);
    
                Data.resize( size + 1);
                file.read(&Data[0],size );
    
                Data[size]='\x00';  // Nullterminator anhängen, sonst gibt cout lustige ASCII Zeichen mit aus
    }
    
    void EineKlasse :: PrintNetworkstat ()
    {
            cout<<&Data[0]<<endl;
    }
    
    int main()
    {
    
    EineKlasse abc;
    
    abc.getUpdateNetworkstat( "test.txt" );
    abc.PrintNetworkstat();
    
    return 0;
    }
    

    wenn ich das nun einbaue bekomme ich diesen fehler:

    43:8: Fehler: »class std::vector<char>« hat kein Element namens »resized«
    

    @sepp
    tut mir leid ich hab nicht alles in diesem thread vorhin gelesen ...
    dazu hab ich wirklich kein plan und hab deswegen ja auch in meinem post gefragt ob ich das falsch verstanden habe.
    wenigstens versuche ich das alles hier zu lernen udn bin über jede hilfe dankbar wenns dich jedoch nervt dann weiß ich nicht lies es nicht oder lösche das?


  • Mod

    Wenn du lernen willst, versuch doch mal den Fehler mit dem resized selber zu lösen. Wie würdest du anfangen, wenn du einen solchen Fehler hast? Tipp: Compiler haben immer Recht, es gibt tatsächlich keine Methode "resized" in std::vector.



  • Enno schrieb:

    43:8: Fehler: »class std::vector<char>« hat kein Element namens »resized«
    

    resized? Gute Guete, du wirst das doch hoffentlich nicht abgetippt haben, oder? 😮



  • SeppJ schrieb:

    Wenn du lernen willst, versuch doch mal den Fehler mit dem resized selber zu lösen. Wie würdest du anfangen, wenn du einen solchen Fehler hast? Tipp: Compiler haben immer Recht, es gibt tatsächlich keine Methode "resized" in std::vector.

    edit: fail

    habs nun erst ganz raus gemacht und dann dort nachgelesen wies heißt



  • Meinst du das eigentlich ernst? Das ist ein Nachbau von vector für C und hat mit std::vector herzlich wenig am Hut. Die richtige Referenz ist hier:
    http://www.cplusplus.com/reference/stl/vector/



  • nu bekomm ich halt immer diesen fehler:

    Speicherzugriffsfehler (Speicherabzug geschrieben)
    


  • Das liegt daran, dass du etwas falsch gemacht hast.
    Ernsthaft: benutze den Debugger (valgrind oder auch gdb) und finde heraus, in welcher Zeile das passiert.



  • ah danke



  • Da hast du wohl murks gebaut.



  • abgeschrieben halt



  • Habs nun so kannnst auch ohne fehler compelieren aber es erscheint nichts?

    void SYSInfo::getDev(std::string filename){
      std::ifstream file(filename.c_str());
      file.seekg(0,std::ios::end);
      long size = file.tellg();
      file.seekg(0,std::ios::beg);
      Data.resize(size + 1);
      file.read(&Data[0],size);
      Data[0]='\x00';
    }
    
    void SYSInfo::printDev(){
      std::cout << &Data[0] << std::endl;
    }
    
    namespace exsystem {
    class SYSInfo {
    public
      void printDev();
      void getDev(std::string filename);
    private:
      std::string Data;
      std::string Dev;
    
    #include "../sysinfo.h"
    
    int main(){
    
      exsystem::SYSInfo a; 
     a.getDev( "/proc/meminfo" ); 
      a.printDev();
      return 0;
    


  • Ich glaube nicht, dass Pseudodateien Seek-Operationen unterstützen.
    Und warum überhaupt so kompliziert?

    #include <iostream>
    #include <fstream>
    
    int main()
    {
        std::cout << std::ifstream("/proc/meminfo").rdbuf();
    }
    

Anmelden zum Antworten