Problem: Werte in map einlesen

LadyMarion

Mitglied
Hallo,

ich hab da mal wieder eine Frage...

Ich habe folgende Datei:
Code:
# Kommentar
# ab   cd   ef   gh
  0.1  2.3  4.3  5.6
  0.2  5.6  7.6  3.4
  0.3  8.7  9.8  1.2
Jetzt möchte ich jeweils auf einen bestimmten Wert zugreifen.
Dabei wird immer erst die Zeile ausgewählt und anschließend die Spalte.
Das Ganze soll mit einer 2-dimensionalen map realisiert werden, wobei der 1. Wert die Zeile und der 2. Wert die jeweilige Spalte darstellt.
Also wenn ich z.B. in der 2. Zeile die Variable ef möchte, dann soll mir 7.6 zurückgegeben werden.

Eigentlich hatte meine Lesefunktion folgendermaßen ausgesehen, aber irgendwie weiß ich nicht, wie ich das Ganze jetzt mit einer map lösen kann...?
Code:
bool leseFkt (const int i)
{
    vector<string> zeilen;
    map<int, map<string, double>> test; // ?
    ifstream IN ("test.txt");
    if (IN.is_open())
    {
        string zeile;
        while (getline(IN, zeile))
        {
            if(!line.empty() && zeile[0] != '#')
            {
                zeilen.push_back(zeile);
                stringstream sstr;
                double ab, cd, ef, gh;
                sstr << zeilen[i-1];
                sstr >> ab >> cd >> ef >> gh;
            }
        }
    IN.close
    return true;
    }
    else
    {
        cout<<"Fehler\n";
        return false;
    }
}

Hoffe, Ihr könnt mir weiterhelfen.

Vielen Dank!
 
Ich denke anstatt map in der map solltest du dir lieber einen container bauen der eine Zeile
beinhaltet und an deine anforderungen angepasst( ist sauberer, stell die mal vor jemand
bräuchte (std::map< std::map< int, std::map<int, int> >, std::map<int, int> >).

Wenn du eine feste Anzahl von spalten hast, brauchst du nichteinmal eine map.
C++:
class ZEILE {
    double m_AB;
    double m_CD;
    double m_EF;
    double m_GH;
};

std::vector< ZEILE > g_Zeilen;

Bei jeder neuen Zeile die anfängt machst du halt g_Zeilen.push_back( new ZEILE );
Oder halt wenn du eine variable spaltenanzahl hast nimmst du im container
vector< double >, wenn du die spalten per string key ansprechen willst eine map.

Wobei ich bei einer map einen pointer als value nehmen würde( ZEILE* ), da wenn man
einen key anspricht der noch nicht vorhanden ist, dieser erstellt wird mit dem default wert
des value. Bei einem pointer wäre das halt ein nullpointer, was du dann auch überprüfen
kannst:
C++:
#include <fstream>
#include <iostream>
#include <map>
#include <string>
#include <vector>

typedef std::map< std::string, double* > SPALTEN_MAP;

class CZeile {
public:
	CZeile() {
	}

	~CZeile() {
		// da die map als Werte pointer auf double enthält müssen wir manuell cleanup machen
		SPALTEN_MAP::iterator iter = Spalten.begin();

		for ( ;iter != Spalten.end();++ iter ) {
			delete iter->second;
			Spalten.erase( iter );
		}
	}

	void FuegeHinzu( std::string Spalte, double Val ) {
		double *NewVal = Spalten[ Spalte ];

		if ( NewVal == NULL ) {
			NewVal = new double;
		}

		memcpy( NewVal, &Val, sizeof ( Val ) );
		Spalten[ Spalte ] = NewVal;
	}

	bool HoleSpalte( std::string Spalte, double *Val ) {
		double *NewVal = Spalten[ Spalte ];

		if ( NewVal == NULL ) {
			/* Für ein noch nicht existierenden angesprochenen
			 * key wird ein neues pair erstellt, brauchen wa
			 * nicht also schmeißen wir das pair gleich wieder raus
			 */
			SPALTEN_MAP::iterator iter = Spalten.begin();

			for ( ;iter != Spalten.end();++ iter ) {
				if ( iter->first == Spalte ) {
					Spalten.erase( iter );
				}
			}

			return false;
		}

		Val = NewVal;

		return true;
	}
private:
	SPALTEN_MAP Spalten;
};

std::vector< CZeile > g_MeinVector;

int main( int argc, char *argv[] ) {
	std::ifstream InFile( "test.txt" );	
	std::string ZeileStr = "";

	while ( std::getline( InFile, ZeileStr ) ) {
		CZeile *ZeileContainer = new CZeile();

		ZeileContainer->FuegeHinzu( SpaltenName, &ZeileDouble1 );
		ZeileContainer->FuegeHinzu( SpaltenName, &ZeileDouble2 );
		ZeileContainer->FuegeHinzu( SpaltenName, &ZeileDouble3 );
		ZeileContainer->FuegeHinzu( SpaltenName, &ZeileDouble4 );
		g_MeinVector.push_back( *ZeileContainer );
	}
}

Best wishes
FBIagent
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück