Kommt nur murks raus



  • Ich glaube nicht, dass Pseudodateien Seek-Operationen unterstützen.

    Selbst wenn sie es unterstützen würden (tun sie nicht), dann würde folgende Zeile immer noch alles ruinieren:

    Data[0]='\x00';
    


  • MFK schrieb:

    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();
    }
    

    Ich solls mit der Klasse und mit get und set machen! Wäre ja schön wenns so leicht wäre 😞

    Bassmaster schrieb:

    #include <iostream> 
    #include <fstream> 
    using namespace std; 
    
    void 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); 
    } 
    
    int main(int argc, char* argv[]) 
    { 
    getDev("test.txt"); 
    cout<<&Data[0]<<endl; //Geht auch so: cout<<Data<<endl; 
    
    return 0; 
    }
    

    sieht gut aus aber egal wie ich es mache ... also ob in der Klasse oder einfach alles in die Main ... der fehler bleibt:

    25:17: Fehler: »Data« wurde in diesem Gültigkeitsbereich nicht definiert
    
    }
    


  • Ich poste noch mal meinen jetzigen Quellentext!

    Also das Problem ist das einfach nichts in der Konsole erscheint! Ich hab auch noch mal mit verschiedenen Dateipfaden rum gespielt!
    /proc/meminfo
    test.txt
    /proc/net/dev <-- da ja nicht geht habs aber probiert

    .h

    #include <iostream>
    #include <vector>
    
    #ifndef SYSINFO_H
    #define SYSINFO_H
    
    namespace exsystem {
    class SYSInfo {
    public:
      void getDev(std::string filename);
      void write();
    private:
      std::string Data;
      std::string Dev;
    

    .cpp

    #include <cstdio>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/reboot.h>
    #include <sys/sysinfo.h>
    #include <sys/utsname.h>
    #include <fstream>
    #include <string>
    #include <vector>
    
    #include "sysinfo.h"
    
    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); 
    
    }
    
    void SYSInfo::write(){
      std::cout << Data << std::endl;
    }
    

    main.cpp

    #include "../sysinfo.h"
    #include <fstream>
    
    int main(){
    
      a.getDev("test.txt"); 
      a.write();
      return 0;
    }
    


  • Enno schrieb:

    Ich solls mit der Klasse und mit get und set machen! Wäre ja schön wenns so leicht wäre 😞

    Ja und?

    #include <sstream>
    #include <iostream> 
    #include <fstream> 
    using namespace std; 
    
    void SYSInfo::getDev(std::string filename) 
    {
       istringstream iss;
       iss << ifstream(filename.c_str()).rdbuf();
       Data = iss.str();
    } 
    
    void SYSInfo::write(){
      std::cout << Data << std::endl;
    }
    


  • @ Enno

    liest du dir eigentlich durch was hier gepostet wird oder machst du nur Copy & Paste 😃

    In dem Quelltext ist ein kleiner Fehler findest du ihn?
    Hinweis: Such mal nach string Data;

    In diesem Fall hier müsste man das string Data; deklarieren.

    Ich hab den Code eben irgendwo zwischen Code von mir gepackt und hab wohl was vergessen mit aus meiner IDE rauszukopieren. 🤡

    WAS könnte das wohl sein?

    #include <iostream> 
     #include <fstream> 
    using namespace std; 
    
    void 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); 
     } 
    
    int main(int argc, char* argv[]) 
     { 
     getDev("test.txt"); 
     cout<<&Data[0]<<endl; //Geht auch so: cout<<Data<<endl; 
    
    return 0; 
     }
    

    Und schau dir mal deine Fehlermeldung an durchlesen und nicht nur kopieren und hier im Forum einfügen ...

    »Data« wurde in diesem Gültigkeitsbereich nicht definiert

    Besser wäre es sowieso wenn du Data als Referenz an die Funktion übergeben würdest.

    Aber bei deinem bisherigen Code hast du ja im moment Data in der Klasse unter private stehen das is ja auch eigentlich ok.

    Aber lass erst mal deine Klasse weg und versuch nur mein simples Beispiel ans laufen zu bekommen danach solltest du das auch in deine Klasse einbauen können.

    Und kauf dir das Buch: http://www.amazon.de/Einführung-die-Programmierung-Pearson-Studium/dp/3868940057

    @ Enno ich hab dir doch den C++ Primer per Email geschickt hast du da eigentlich mal reingeschaut? Oder hab ich den wem anderes geschickt mhhm 😕



  • Erstmal vielen Dank für deine Geduld und natürlich lese ich alles und probiere rum! Da du das nicht siehst kommt das natürlich so wie copy paste rüber 😞

    Bassmaster schrieb:

    @ Enno

    liest du dir eigentlich durch was hier gepostet wird oder machst du nur Copy & Paste 😃

    In dem Quelltext ist ein kleiner Fehler findest du ihn?
    Hinweis: Such mal nach string Data;

    In diesem Fall hier müsste man das string Data; deklarieren.

    Ich hab den Code eben irgendwo zwischen Code von mir gepackt und hab wohl was vergessen mit aus meiner IDE rauszukopieren. 🤡

    WAS könnte das wohl sein?Weiß ich leider irgentwie nicht

    #include <iostream> 
     #include <fstream> 
    using namespace std; 
    
    void 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); 
     } 
    
    int main(int argc, char* argv[]) 
     { 
     getDev("test.txt"); 
     cout<<&Data[0]<<endl; //Geht auch so: cout<<Data<<endl; 
    
    return 0; 
     }
    

    Und schau dir mal deine Fehlermeldung an durchlesen und nicht nur kopieren und hier im Forum einfügen ...

    »Data« wurde in diesem Gültigkeitsbereich nicht definiert

    Besser wäre es sowieso wenn du Data als Referenz an die Funktion übergeben würdest.Das hab ich nun noch nicht verstanden werde nun aber google bewegen

    Aber bei deinem bisherigen Code hast du ja im moment Data in der Klasse unter private stehen das is ja auch eigentlich ok.

    Aber lass erst mal deine Klasse weg und versuch nur mein simples Beispiel ans laufen zu bekommen danach solltest du das auch in deine Klasse einbauen können.

    Und kauf dir das Buch: http://www.amazon.de/Einführung-die-Programmierung-Pearson-Studium/dp/3868940057

    Ich hab es nun so:

    #include "../sysinfo.h"
    #include <fstream>
    
    void getDev(std::string filename){ 
      std::string Data; // das hier fehlt auf jeden Fall?
      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); 
     }
    
    int main(){  
    
      std::string Data; // hier müsste man das glaube ich nicht deklarieren oder?
      getDev("test.txt"); // kann man das vllcht so machen mit diesem a.getDev? da weiß ich nicht genau was ich machen soll!
      std::cout << &Data[0] << std::endl;
    
      return 0;
    }
    

    EDIT: @Bassmaster hab die e-mail nicht bekommen ... schick nochmal an sesshafter@yahoo.de oder sag mir an welche du geschickt hast? hab aber alles durch geguckt


  • Mod

    Enno schrieb:

    Erstmal vielen Dank für deine Geduld und natürlich lese ich alles und probiere rum!

    Nicht probieren! Probieren ist was für den Hosenkauf. Beim Programmieren ist wichtig zu wissen, was man tut. Code ist Logik pur, du musst von jedem Zeichen in deinem Programm wissen, was es bedeutet und warum du es gesetzt hast. Kauf dir ein Buch! Mit ein paar Tagen Lernen hättest du das Problem schon längst gelöst, so einfach ist das. Stattdessen fragst du hier schon seit Anfang September immer wieder die gleiche Frage und hast dabei gefühlt noch keine einzige Antwort so richtig verstanden.



  • Enno schau mal in deine Emails ich hab dir gerade eine Email geschrieben.

    So wäre es richtig:

    #include <iostream> 
    #include <fstream> 
    using namespace std; 
    
    string Data;  // Globale Variable ist hier überall gültig
    
    void 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); 
     } 
    
    int main(int argc, char* argv[]) 
    { 
     getDev("test.txt"); 
     cout<<&Data[0]<<endl; //Geht auch so: cout<<Data<<endl; 
    
    return 0; 
    }
    

    Oder so mit Referenz geht auch:

    #include <iostream> 
    #include <fstream> 
    using namespace std; 
    
    void getDev(std::string filename, string &Data)
     {
        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);
     }
    
    int main(int argc, char* argv[])
    {
    string Data; // Lokale Variable welche nur im int main() scope gültig ist
    
    getDev("test.txt", Data );
    cout<<&Data[0]<<endl; //Geht auch so: cout<<Data<<endl;
    
    return 0;
    }
    

    Google mal nach Begriff Scope im Zusammenhang mit C++.

    Hier steht auch was dazu: http://msdn.microsoft.com/en-us/library/b7kfh662(v=vs.80).aspx ( Linux, MAC, Window Betriebssystem unabhängig )



  • Ich versteh es nicht ... jetzt hab ich das alles genau so ... er gibt mir auch kein fehler nur wenn ich es ausführe kommt nichts ....
    naja ich les mal den primer 😕 hab die e-mail jetzt auch bekommen



  • Entweder existiert bei dir die Datei test.txt nicht in dem Ordner wo dein Programm liegt oder in der Datei steht kein Text drin.

    Versuchs mal so:

    #include <iostream> 
    #include <fstream> 
    using namespace std;
    
    string Data;
    
    void getDev(std::string filename)
     {
            ifstream file(filename.c_str());
    
            if ( ! file.good() )
            {
                    cout<<"Die Datei "<<filename<<" existiert nicht"<<endl;
                    return ;
            }
    
        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);
     }
    
    int main(int argc, char* argv[]) 
    { 
     getDev("test.txt"); 
     cout<<&Data[0]<<endl; //Geht auch so: cout<<Data<<endl; 
    
    return 0; 
    }
    


  • jawohl lag falsch und jetzt kam auch die message ... liegt nun richtig und klappt 🙂 du bist ein schatz^^
    ich werd nun den primer weiter lesen und da ich bis zum ende der woche zeit hab mich wohl dann melden ob es alles klappt.



  • Oh man, was für ein Gefrickel. Wenn Du mit dem Inhalt wirklich nur einen String füllen willst:

    #include <string>
    #include <iterator>
    #include <fstream>
    #include <istream>
    
    std::string get_dev(std::string const & file)
    {
        std::ifstream reader(file.c_str());
        std::istreambuf_iterator<char> i(reader);
        std::istreambuf_iterator<char> end;
        return std::string(i, end);
    }
    

    Benutzung: std::cout << get_dev("bla.dat") << '\n';



  • So ich hab es nun noch einmal anders gemacht ...

    Nur hab ich irgendwie ein linker Problem wenn ich das bei den gegoogelten Sachen richtig gelesen haben!
    Hab aber nichts für die Lösung gefunden!

    #include <iostream>
    
    #ifndef SYSINFO_H
    #define SYSINFO_H
    
    namespace exsystem {
    class SYSInfo {
    public:
      const char *getDev();
    
    #include <fstream>
    #include <string>
    #include <iostream>
    
    #include "sysinfo.h"
    
    //#ifdef POSIX
    
    using namespace exsystem;
    
    const char *getDev(){
      std::string line;
      std::ifstream read("test.txt");
      if (read.is_open()){
    
        while (getline(read, line)){
          std::cout << line << std::endl;
        }
        read.close();
      }
    
      else std::cout << "Unable to read file" << std::endl; 
    }
    
    #include <iostream>
    
    #include "../sysinfo.h"
    
    int main (){
      exsystem::SYSInfo a;
      std::cout << "Net: " << a.getDev() << std::endl;
    }
    

    Fehler:

    sysinfo.cpp:(.text+0x1d): undefined reference to `exsystem::SYSInfo::getDev()'
    collect2: ld gab 1 als Ende-Status zurück
    


  • Was machst du denn da schon wieder. ^^ --> const char *getDev() 😮

    Tachyon hat doch eine saubere Lösung bereits für dich gebaut.

    Du musst doch nur die Funktion von Tachyon in deine Klasse einbauen.
    Naja und ab besten noch prüfen ob die Datei auch wirklich existiert und on diese ausgelesen werden konnte.

    Schreib mal in deinem Code:

    std::string exsystem :: SYSInfo :: get_dev(std::string const & file)
    {
        std::ifstream reader(file.c_str());
        std::istreambuf_iterator<char> i(reader);
        std::istreambuf_iterator<char> end;
        return std::string(i, end);
    }
    

    Wenn es funktioniert dann kannste ja noch die Abfragen einbauen.

    Minimier die Sacheb mal aufs minimalste schreib z.b. erst eine Klasse ohne den Namespace Kram und versuch es dadrin zum laufen zu bekommen. Ich glaub das wäre für dich erstmal etwas leichter. Danach kannste ja die Namespace Sachen einbauen



  • Er compiliert das wunderbar^^ wie bei meinem kram auch!

    Nur mir scheint irgendwie eine Lib abhanden gekommen zu sein oder so ?!

    hab es so eingefügt und tada:

    undefined reference to `exsystem::SYSInfo::getDev()'
    collect2: ld gab 1 als Ende-Status zurück
    


  • Enno, warum gibt getDev() nichts zurück? Und wenn sie eine Memberfunktion von SYSInfo ist, dann musst du das bei der Definition auch angeben.



  • Wow 😃 haha endlich klappt es!

    Sogar beide varianten xD und da das hier mit dem const char * hier vorgegeben ist lass ich die stehen =).
    Problem war das #include <fstream> in der Main gefehlt hat und das bei dem was ich oben gepostet hab das SYSInfo:: fehlte!

    Vielen danke für die ganze geduldige Hilfe nun hab ich es alles auch verstanden! ❤



  • Enno schrieb:

    Vielen danke für die ganze geduldige Hilfe nun hab ich es alles auch verstanden! ❤

    Das glaub ich dir nicht. 😃



  • Frag mich was zu meinem Code ich kann es alles erklären!



  • Warum schreibst du:

    const char *getDev()
    

    und nicht

    std::string getDev();
    

    Warum lässt du keine Wert zurückgeben?


Anmelden zum Antworten