Problem mit Dateien



  • Hi,
    ich habe folgendes Problem:
    ich schreibe grade an einem kleinen Parser um einfache
    einstellungen aus einer vereinfachte ini-datei auszulesen die so aussieht:

    Einstellung=Wert;

    Dabei hab ich grad nen Fehler bekommen.
    Ich habe die funktion IniParser::read(string data_from_stream)
    die den gesamten Text des Streams einfach in einem String speichern soll:

    void IniParser::read(string *data_from_stream)
    {
    
       if (this->data_stream->good())
       {
           while(this->data_stream->eof()!=true)
           {
               char *tmp = new char;
               this->data_stream->get(&tmp);
               data_from_stream=data_from_stream->c_str()+tmp;
               this->data_stream->seekg()=this->data_stream->tellg()+1;
    
           }
    
       }
    }
    

    Klassendeklaration sieht so aus:

    class IniParser
    {
        public:
            string *path;
            fstream *data_stream;
            void getValue(string *val); //returns the value of a given (integer-)setting
            void read(string data_from_stream); //reads the whole file into one stream
    
            void init(string *path); //initialises the stream
            void close(); //closes the stream
    
            IniParser();
            ~IniParser();
    };
    

    Jetzt bekomme ich aber unter MingW die folgende Fehlermeldungen:

    C:\c++\IniParser\IniParser.cpp||In member function void IniParser::read(std::string)':| **C:\\c++\\IniParser\\IniParser.cpp|41|error: no matching function for call tostd::basic_fstream<char, std::char_traits<char> >::get(char*&)'|**
    C:\Programme\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\bits\istream.tcc|441|note: candidates are: typename std::basic_istream<_CharT, _Traits>::int_type std::basic_istream<_CharT, _Traits>::get() [with _CharT = char, _Traits = std::char_traits<char>]|
    C:\Programme\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\bits\istream.tcc|472|note: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::get(_CharT&) [with _CharT = char, _Traits = std::char_traits<char>]|
    C:\Programme\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\bits\istream.tcc|504|note: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::get(_CharT*, std::streamsize, _CharT) [with _CharT = char, _Traits = std::char_traits<char>]|
    C:\Programme\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\istream|326|note: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::get(_CharT*, std::streamsize) [with _CharT = char, _Traits = std::char_traits<char>]|
    C:\Programme\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\bits\istream.tcc|543|note: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::get(std::basic_streambuf<_CharT, _Traits>&, _CharT) [with _CharT = char, _Traits = std::char_traits<char>]|
    C:\Programme\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\istream|359|note: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::get(std::basic_streambuf<_CharT, _Traits>&) [with _CharT = char, _Traits = std::char_traits<char>]|
    C:\c++\IniParser\IniParser.cpp|42|error: invalid operands of types `const char' and `char' to binary operator+'|** **C:\\c++\\IniParser\\IniParser.cpp|43|error: no matching function for call tostd::basic_fstream<char, std::char_traits<char> >::seekg()'|**
    C:\Programme\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\bits\istream.tcc|865|note: candidates are: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::seekg(typename _Traits::pos_type) [with _CharT = char, _Traits = std::char_traits<char>]|
    C:\Programme\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\bits\istream.tcc|893|note: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::seekg(typename _Traits::off_type, std::_Ios_Seekdir) [with _CharT = char, _Traits = std::char_traits<char>]|
    C:\c++\IniParser\IniParser.cpp|43|error: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second:|
    C:\Programme\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\bits\postypes.h|176|note: candidate 1: std::fpos<_StateT> std::fpos<_StateT>::operator+(std::streamoff) const [with _StateT = mbstate_t]|
    C:\c++\IniParser\IniParser.cpp|43|note: candidate 2: operator+(std::streamoff, int) <built-in>|
    ||=== Build finished: 4 errors, 0 warnings ===|

    Die fetten verstehe ich ja auch wenn ich nicht weiss woher die kommen.
    Die bedeuten doch das das Objekt Datastream keine Memberfunktion mit dem Namen get(char& c) hat.
    Diese Funktion steht aber ganz klar in der Dokumentation der std.

    Aus dem unterstrichenen Fehler werd ich überhaupt nicht schlau.

    Noch ne Anmerkung: Wenn ich irgentwo Fehler mit Zeigern gemacht habe sagt mir das Bitte, ich hab bisher nur selten in dem Maße mit Zeigern gearbeitet und
    verstehe das Konzept noch nicht so gut

    Ich Hoffe ihr könnt mit helfen
    MFG
    Neophyte



  • Deine Funktion read ist so deklariert

    void read(string data_from_stream); //reads the whole file into one stream
    

    und so definiert

    void IniParser::read(string *data_from_stream)
    

    Fällt dir der Unterschied auf?



  • data_from_stream=data_from_stream->c_str()+tmp;
    

    Du kannst 2 Zeiger nicht addieren. Die Zeile ist sowieso sehr seltsam formuliert (c_str ist hier absolut unnötig). Mach's doch einfach so:

    data_from_stream+=*tmp;
    
    this->data_stream->seekg()=this->data_stream->tellg()+1;
    

    seekg ist eine Funktion, der kannst du nix zuweisen!



  • Danke schon mal,
    meine read-methode sieht jetzt so aus:

    void IniParser::init(string *path)
    {
        this->data_stream->open(path->c_str(),ios::in);
    }
    
    void IniParser::read(string *data_from_stream)
    {
    
       if (this->data_stream->good())
       {
           while(this->data_stream->eof()!=true)
           {
               char tmp;
               int position;
               this->data_stream->get(tmp);
               data_from_stream+=tmp;
               position=this->data_stream->tellg();
               this->data_stream->seekg(position+1);
    
           }
    
       }
       else
       {
           cout<<"Problem mit Datastream"<<endl;
       }
    }
    

    Wenn ich das Programm jedoch starte passiert nichts, mein code::blocks zeigt mir nur an: Process returned 0 (0x0) executuion time 4,546 sec...
    Wisst ihr woran das liegen könnte?
    Meine main.cpp sieht so aus:

    int main()
    {
        IniParser *parser;
        parser=new IniParser;
        string path;
        cout<<"Bitte geben sie den Pfad zur zur ladenden Datei an!"<<endl;
        cin>>path;
        parser->init(&path);
        string output;
        parser->read(&output);
        cout << output<< endl;
        return 0;
    }
    

Anmelden zum Antworten