Hallo,
ich habe Probleme mit zwei Dim. Vectoren, ich möchte ein zwei Dim. "Array" aufbauen das folgendermassen aussieht:
ZitatAlles anzeigenInt String
0 text0
1 text0
1 text1
1 text2
2 text0
3 text0
Die Daten hole ich mir aus einer Datei (liste):
ZitatAlles anzeigentext0
text0
[BLOCK]text0
text1
text2
text3
text4[/BLOCK]
text0
Dazu habe ich mir folgenden Code gebastelt, was so auch funktioniert.
Was ich an dieser Stelle nicht 100%ig kapiere ist "vector< vector<string> >liste(BLOCK);" --> dies müsten zwei verschachtelte Vectoren vom Typ <string> mit jeweils 500 intialisierten Felder "BLOCK=500;" sein (??) !
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
const char *const FILENAME = "/tmp/liste";
const int BLOCK=500;
int block=0;
string line;
bool blockstart = false;
int main()
{
vector< vector<string> >liste(BLOCK);
ifstream inFile(FILENAME);
if (!inFile) { cout << "Kann Datei " << FILENAME << " nicht oeffnen!" << endl; exit(1); }
while(!inFile.eof())
{
getline(inFile,line);
if (line.substr(0,7) == "[BLOCK]") { blockstart=true; }
if (line.find("[/BLOCK]") != string::npos) { blockstart=false; }
if (line.find("[/BLOCK]") != string::npos ) { line.erase(line.find("[/BLOCK]")); }
if (line.find("[BLOCK]") != string::npos ) { line.erase(0,7); }
if( (!blockstart) ) { liste[block].push_back(line); block++; }
if( (blockstart) ) { liste[block].push_back(line);}
}
for (int index=0; index<500; index++)
{
for (int index1=0; index1<liste[index].size(); index1++)
{
cout << "Block=" << index << " Data=" << index1 << " " << liste[index][index1] << endl;
}
}
return 1;
}
Alles anzeigen
Ausgabe:
ZitatAlles anzeigenBlock=0 Data=0 text0
Block=1 Data=0 text0
Block=2 Data=0 text0
Block=2 Data=1 text1
Block=2 Data=2 text2
Block=2 Data=3 text3
Block=2 Data=4 text4
Block=3 Data=0 text0
Block=4 Data=0 text0
Nun versuche ich das ganze mit einer Klasse zu realisieren:
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
string FILENAME = "/tmp/liste";
int block=0;
bool blockstart = false;
class v_array
{
private:
int pos;
string text;
vector<int> v_pos;
vector<string> v_text;
public:
void set(int pos, string text);
void get(int pos, int text);
int posSize (void);
int textSize (void);
void vdelete (void);
};
void v_array::set (int pos, string text)
{
v_pos.push_back(pos);
v_text.push_back(text);
}
void v_array::get (int pos, int text)
{
cout << "Block=" << v_pos[pos] << " Data=" << v_text[text] << endl;
}
int v_array::posSize (void)
{
return v_pos.size();
}
int v_array::textSize (void)
{
return v_text.size();
}
void v_array::vdelete (void)
{
v_text.clear();
v_pos.clear();
}
int main()
{
v_array v_Liste;
string line;
ifstream inFile(FILENAME.c_str());
if (!inFile) { cout << "Kann Datei " << FILENAME << " nicht oeffnen!" << endl; exit(1); }
while(!inFile.eof())
{
getline(inFile,line);
if (line.substr(0,7) == "[BLOCK]") { blockstart=true; }
if (line.find("[/BLOCK]") != string::npos) { blockstart=false; }
if (line.find("[/BLOCK]") != string::npos ) { line.erase(line.find("[/BLOCK]")); }
if (line.find("[BLOCK]") != string::npos ) { line.erase(0,7); }
if( (!blockstart) ) { v_Liste.set(block++,line); }
if( (blockstart) ) { v_Liste.set(block,line); }
}
inFile.close();
for (int index=0; index < v_Liste.posSize(); index++) { v_Liste.get(index,index); }
v_Liste.vdelete();
return 1;
}
Alles anzeigen
Ausgabe:
ZitatAlles anzeigenBlock=0 Data=text0
Block=1 Data=text0
Block=2 Data=text0
Block=2 Data=text1
Block=2 Data=text2
Block=2 Data=text3
Block=2 Data=text4
Block=3 Data=text0
Block=4 Data=text0
Allerdings ist das Beispiel jetz eigentlich falsch, das es sich um zwei eigenständige Vectoren handelt!
Dies habe ich auch nur Versucht um zu sehen, ob man den Vector in einer Klasse definieren kann.
Das Ziel ist es eigentlich einen zwei Dim. Vector in der Klasse zu initalisieren, damit die anderen Klassenmember ebenfalls auf das "Array" bzw. auf den vector zugreifen können --> dies gelingt mir aber nicht !!!
Durch langes probieren meckert der Compiler nicht mehr wenn ich in der Private Class folgendes deklariere (aber ob das richtig ist?):
Nur habe ich dann folgendes Problem wenn ich "liste.push_back(text);" in v_array::set" einfüge:
void v_array::set (int pos, string text)
{
v_pos.push_back(pos);
v_text.push_back(text);
liste.push_back(text); <--- ZEILE 35
}
Zitat
test.c: In member function ‘void v_array::set(int, std::string)’:
test.c:35: error: ‘((v_array*)this)->v_array::liste’ does not have class type
Habe schon gegoogelt aber ich verstehe dies alles nicht so recht, ich denke man muss das irgendwie mit Pointern lösen (aber soweit bin ich noch nicht, bzw. ich erlese es mir erst gerade ).
Sicherlich könnte man dies auch mit einem echten Array "liste[block][text]" lösen, aber wenn ich es richtig gelesen habe ist der c++ Weg der mit den Vectoren (?), aber viele Wege führen nach Rom und ich möchte es eigentlich nun auch verstehen was da nicht funktioniert.
Gruß.
Chuck