einleseroutine angucken



  • hallo,
    ich habe eine Einleseroutine geschrieben, die zum einen sehr langsam ist und zum anderen imho nach ca. 90.000 Dateioperationen abstürzt:

    Die einzulesende Datei hat dabei folgende Struktur:
    1. Zeile Statusinformationen -> hier ignorieren
    15 zeichen, danach 10 mal je 5 zeichen (diese stellen einen double-Wert dar)

    Und folgendes soll die Routine tun:
    Es gibt ein Array VarNummern[10], in dem die ausgewählten Variablen stehen. Zum Beispiel will ich nur die Variablen 1, 2 und 6 auslesen, dann sähe das so aus: [1,2,6]. Mit dieser Nummer wird dann beim Einlesen multipliziert und an die entsprechende Stelle gesprungen.

    und das mache ich draus:

    ifstream datei(DateiName);
    strstream stringstream;
    stringstream.clear();
    datei.clear();

    char lineread[250];
    char wert[5];

    int counter = 0;
    int pos;
    double dwert = 0;

    datei.seekg (0, ios::beg);
    datei.getline(lineread, 250, '\n'); //so überlese ich die erste zeile

    dataArray.clear(); // mein neuer vector 😉

    for (int j=0; j<AnzahlDS; j++)
    {
    datei.seekg (16, ios::cur); //15 zeichen überlesen
    pos = datei.tellg();
    for (int i=0; i<Variablen; i++)
    {
    datei.seekg(pos);
    datei.seekg((VarNummer[i]-1)*5,ios::cur);
    datei.get(wert,5);
    stringstream << wert;
    stringstream >> dwert;
    dataArray.push_back(dwert);
    stringstream.clear();
    };
    datei.getline(lineread, 250, '\n'); //bis ende der zeile lesen
    };

    Hmm .. das ist sicher sehr verbesserungswürdig.
    Vorschläge, Ideen, Tipps?

    Danke, Marrt



  • Ich schieb das noch mal nach oben, es wäre echt nett, wenn sich jemand mal die Mühe machen könnte und sich das mal kurz (oder länger;)) angucken würde.

    Marrt



  • ohne Syntax Coloring macht das kein spaß so viel Code anzugucken. sfds <-- also bitte beachten.

    Aber
    a) strstream gibt es nicht mehr im neuen C++ Standard und wurden durch stringstreams ersetzt
    b) wenn du den MSVC++ 6 benutzt, da ist die STL kaputt und Datei einlesen ist wohl extrem langsam



  • hmm, b) trifft zu. bei jemand anders, der .net hat, ging das sehr viel schneller. und was kann ich da machen?

    bei denmjenigen stürzt die routine aber trotzdem auch ab, wenn über 80.000 datensätze gelesen werden. woran kann das liegen?

    mfg Marrt



  • ifstream datei(DateiName);
    strstream stringstream;
    stringstream.clear();
    datei.clear();
    
    char lineread[250];
    char wert[5];
    
    int counter = 0;
    int pos;
    double dwert = 0;
    
    datei.seekg (0, ios::beg);
    datei.getline(lineread, 250, '\n'); //so überlese ich die erste zeile
    
    dataArray.clear(); // mein neuer vector ;)
    
    for (int j=0; j<AnzahlDS; j++)
    {
    datei.seekg (16, ios::cur); //15 zeichen überlesen
    pos = datei.tellg();
    for (int i=0; i<Variablen; i++)
    {
    datei.seekg(pos);
    datei.seekg((VarNummer[i]-1)*5,ios::cur);
    datei.get(wert,5);
    stringstream << wert;
    stringstream >> dwert;
    dataArray.push_back(dwert);
    stringstream.clear();
    };
    datei.getline(lineread, 250, '\n'); //bis ende der zeile lesen
    };
    

    besser?



  • strstream stringstream;
    	ifstream datei(NeuDateiName);
    
    	stringstream.clear();
    	datei.clear();
    
    	char lineread[250];
    	char wert[5];
    	char wort[16];
    
    	for (int j=0; j<AnzahlDS; j++)
    		{
    		datei.getline(lineread, 250, '\n');
    		datei.get(wert
    		for (int i=0; 65; i++)
    			{
    			if (i<16) {wort[i] = lineread[i];}
    			else
    				{
    				if ( i<21 )
    					{
    					wert[zahlcnt] = lineread[i];
    					++zahlcnt;
    					}
    				else
    					{ // näxte zahlgefunden
    					zahlcnt = 0;
    					char a = wert[0];
    					stringstream << wert;
    					stringstream >> dwert;
    					dataArray2[counter2] = dwert;
    					stringstream.clear();
    					counter2++;
    					}
    				}
    			}
    		}
    

    Dies ist der nächste Versuch, aber auch das klappt nicht. Die Zuweisung der Zeichen an die Variable wert haut nicht hin, da wird immer komplett lineread übergeben und ich weiss nicht wieso.

    Zweite Frage: Überall lese ich was von strToDouble(), nur bei mir wird das als unideclared identifier angezeigt. Muss ich da noch was einbinden?

    Gruss Mart



  • line 14 is of course:

    datei.get(wert,5);
    

Anmelden zum Antworten