Mehrdimmensionales array mit textdatei befüllen?

klein611

Grünschnabel
Ich hab folgendes Problem.
ich möchte aus einer txt-datei 3 stücke auslesen und das sieht ungefähr so aus:

aufzählung|bildpfad|antwort zu bild (sind insgesammt ca 50 zeilen)

das problem dass sich mir jetzt stellt ist, dass ich das nicht hinbekomme die arrays zu befüllen.
array[0][1] mit der aufzählung
array[1][1] mit dem bildpfad
array[2][1] mit der antwort
usw...
Code:
#include <Windows.h>
#include <iostream>
#include <string>
#include <cstring>
#include <fstream>

using namespace std;
bool seperate(char* string, char* word, int& wordOffset);
int main(){
	const int buffersize = 255;
	char buffer[buffersize+1];
	char word[buffersize+1];
	int wordOffset = 0;
	char buffer_array[3][5];
	
	ifstream in("test.txt");
		if(!in) {
			cout << "Cannot open input file.\n";
			return 1;
			}
			in.getline(buffer,buffersize);
			while(seperate(buffer,word,wordOffset))
			{
				cout << "Dieses Wort ausgelesen: " << word << endl;
				cout << sizeof(word)<<endl;
				cout << strlen(word)<<endl;
			}

		Sleep (20000);
	return 0;
}

bool seperate(char* string, char* word, int& wordOffset)
{
         if (!string[wordOffset])  
              return false;
    
         char *p1, *p2;
         p1 = p2 = string+wordOffset;  
            
         for (int i = 0; i<(int)strlen(p1) && !isalnum(p1[0]); i++)
              p1++;
             
         if (!isalnum(p1[0]))
              return false;
    
         p2 = p1; 
    
         
         while (isalnum(p2[0]))
              p2++;

         
         int len = int (p2 - p1);

         strncpy (word,p1,len);

         word[len]='\0';

         for (int i = int(p2-string); i<(int)strlen
             (string) && !isalnum(p2[0]); i++)
              p2++;

         wordOffset = int(p2-string);

         return true;
         
}

was ich mit dem array bezwecken will ist, dass das programm nicht immer auf die txt zugreift. bei einer anderen lösung wär ich auch sehr dankbar.

DANKE
 
Hallo,

zuerst mal zu der Array-Struktur.
Die erste Dimension bezeichnet normalerweise die Zeile, die zweite dann das Feld. Desweiteren fangen Arrays normalerweise bei 0 an, nicht bei 1.
In deinem Beispiel würde es also so aussehen:

array[0][0] mit der aufzählung
array[0][1] mit dem bildpfad
array[0][2] mit der antwort
Abstrakt: array[Zeile][Feld]

Wenn du dir eine Funktion zum Teilen eines Strings in mehrere Teile schreibst, dann kannst du folgendes machen (Pseudocode):

Code:
- lies zeile X aus, für jede Zeile wird X inkrementiert
- speichere explode(zeile, trenner) in buffer[X]
- spring zum zeilenlesen

Da ich in C++ nicht so bewandert bin (ich bevorzuge C ;)), überlasse ich das weitere den anderen Mitgliedern des Forums.

Falls du noch eine Funktion zum Teilen eines Strings in mehrere Teile brauchst, ich habe hier erst vor kurzem eine in C gepostet, die kannst du normalerweise auch bei dir verwenden.

Gruß
BK
 
Hallo klein611,

so wie dein "buffer_array" deklariert hast, kann es pro Array-Element nur jeweils ein einziges Zeichen speichern. Um Strings zu speichern müsstest du ein Array auf char-Zeiger deklarieren und dich um die Speicherbereitstellung für jeden Text kümmern.
Da du ja eh schon Elemente der STL (string, ifstream) verwendest, könntest du konsequenterweise die gesamte Datenhaltung mit Containerklassen aus STL abbilden. Das hätte auch den Vorteil, dass die Datenhaltung recht einfach dynamisch werden kann, d.h. unabhängig von der Zeilenanzahl der Textdatei.
Hier ein kleines Beispiel nur zur Datenhaltung:
C++:
#include <iostream>
#include <vector>

typedef struct
{
    std::string strAufz;
    std::string strPfad;
    std::string strAntw;

} data;

int main()
{
    std::vector<data> vec_data;

    // Zuweisen

    for( int i = 0; i < 50; ++i ) 
    {
        data myData;
        myData.strAufz = "aufzählung";
        myData.strPfad = "bildpfad";
        myData.strAntw = "antwort zu bild";

        vec_data.push_back(myData);
    }

    // ... und anzeigen
   
    std::vector<data>::const_iterator it;

    for( it = vec_data.begin(); it != vec_data.end(); ++it )
    {
        std::cout << (*it).strAufz
                  << ", "
                  << (*it).strPfad
                  << ", "
                  << (*it).strAntw
                  << std::endl;
    }

    return 0;
}
Gruß
MCoder
 

Hallo,

Ich habe gerade ein Problem mit einem dreidimensionalen const char array.

Code:
const char comboitems0[3][10]={"1024*768","1280*960","1280*1024"};
const char comboitems1[3][7]={"High","Medium","Low"};
const char comboitems2[3][7]={"High","Medium","Low"};
const char comboitems3[4][8]={"High","Medium","Low","Disable"};
const char comboitems4[2][8]={"Enable","Disable"};
const char comboitems5[2][8]={"Enable","Disable"};
const char comboitems6[5][2]={"1","2","3","4","5"};
const char comboitems7[4][8]={"Highest","High","Medium","Low"};

->

const char comboitems[8][5][10]={{"1024*768","1280*960","1280*1024"," "," "},
                                {"High","Medium","Low"," "," "},
                                {"High","Medium","Low"," "," "},
                                {"High","Medium","Low","Disable"," "},
                                {"Enable","Disable"," "," "},
                                {"Enable","Disable"," "," "},
                                {"1","2","3","4","5"},
                                {"Highest","High","Medium","Low"," "}};

So sieht es im zweidimensionalen Fall aus, kann mir jemand helfen das in 3D zu deklarieren?

Problem gelöst =)

mfg. Poseidon
 
Zuletzt bearbeitet:
Zurück