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 to
std::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 binaryoperator+'|** **C:\\c++\\IniParser\\IniParser.cpp|43|error: no matching function for call to
std::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 gutIch 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; }