Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » [vc++] String aufsplitten ???

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ] [ 3 ]
000
12.09.2003, 18:00 Uhr
~Luke
Gast


Hi Leute,
ich habe n riiisen Problem!

Ich bin dabei ein Programm zu schreiben das eine Configdatei einliest.
Die Configdatei ist im format
Code:
Key "Value"
aufgebaut.
Ich will nun diese key-value paare in ein array speichern.
Dazu habe ich die Datei zeilenweise eingelesen und suche nun eine möglichkeit den ersten Teil des Strings bis zu einem Leerzeichen oder Tabulator in eine Variable "key", und den 2. Teil innerhalb der Anführungszeichen in eine Variable "value" zu speichern.
Diese sollen in ein Array einer Klasse gespeichert werden, so dass ich nachher mit klassenarray[i].key bzw. klassenarray[i].value auf die key-value paare zugreifen kann.
Dazu soll das Programm nicht wissen welche werte "key" bzw. "value" haben könnten.
Dazu mal n Bissl Code um das zu veranschaulichen:

C++:
#include "stdafx.h"
#include "string.h"
#include "iostream.h"

class Config
{
public:
    void readconfig(char *filename);
private:
    char *key, *value;
};

void Config::readconfig(char *filename)
{
    char line[50];
    int length=50;
    FILE *stream;
    stream = fopen(filename, "r");    
    while((fgets(line,length,stream)) != NULL)
    {
    /*   HIER FEHLT MIR CODE  =(  */
    }
    fclose(stream);
}

int main(void)
{
    char *datei = "C:\\test.cfg";
    Config conf1;    /* <--- HIER SOLL EIN ARRAY DEFINIERT WERDEN  */
    conf1.readconfig(datei);    /* HIER SOLL EIN ARRAY EINGELESEN WERDEN   */
    return 0;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
12.09.2003, 18:11 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


wenn du mfc arbeitest gibts folgende möglichkeit:


C++:
AfxExtractSubString(...);



Ist ein undokumentierter MFC-Befehl, Visual C++ sollte dir aber die Parameter anzeigen.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
12.09.2003, 18:12 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


na einfach den eigelesenen string so lange durchgehen bis du ein leezeichen oder tab findest. Dann kopierst du den ersten teil in key und den rest in value
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
12.09.2003, 18:22 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


in etwa so
vorsicht ungetestet

C++:
char key[50];
char value[50];
int i,j;
for(i=0;!isspace(line[i]);++i);
memcpy(key,line,i*sizeof(char));
for(j=i+1;!isspace(line[j]);++j);
memcpy(value,&line[i+1],j*sizeof(char));


--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 12.09.2003 um 18:23 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
12.09.2003, 18:24 Uhr
typecast
aka loddab
(Operator)


[meckermode]
C++ und char*. Wozu gibts std::string....
[/meckermode]
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
12.09.2003, 18:32 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@Loddab
du fängst ja schon an wie virtual
bei dem heisst das immer nörgelmode
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
12.09.2003, 21:45 Uhr
~Luke
Gast


Hey, das hört sich gut an!
Ich denke mal der cstring is echt keine schlechte lösung, ma sehen ob ich das nicht kombiniert bekomme!
Thx schon mal

Luke
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
12.09.2003, 23:37 Uhr
~Luke
Gast


Jo, habe nun das Problem gelöst, jetzt bräuchte ich noch eine Lösung wie ich die key-value paare in ein array lesen kann.
In meiner funktion werden beide Werte für jede zeile ausgegeben (bzw. ermittelt).
Jetzt bräuchte ich eine möglichkeit ein dynamisches array zu erstellen, das für jedes weitere key-value paar ein weiteres Feld anhängt.
Das Array sollte vom typ meiner klasse sein und in jedem feld die informationen key und value speichern.
Keine AHnung wie ich das jetzt anstelle, weis ja nicht mal wie ich ein statisches array so anlege...
Kann mir da jemand n Tip geben?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
13.09.2003, 00:32 Uhr
kronos
Quotenfisch
(Operator)


du könntest die newlines zählen oder in diesem speziellen beispiel die länge des files ermitteln und durch 50 (wenn das die exakte zeilenlänge ist) teilen.
z.b. (streamlänge)

C++:
int GetLength(FILE *file){
int c, count = 0;
c = fgetc(file);
while (c!=0){
c = fgetc(file);
count++;
return count;
}
rewind(file); // "zurückspulen", damit du von vorne lesen kannst
}


dann machst du einfach

C++:
my_array[GetLength];


edit:
wenn du arry.key bzw. array.value verwenden willst, muss der array entsprechende structuren enhalten. das könnte so aussehen:

C++:
struct keystructur {
char *value;
int key;
} // "keystruct" beherbergt nun die felder value und key

struct keystructur array[Lines]
// "array" enthält nun eine durch "Lines"
// festgelegte anzahl von keystructs



nun kannst du z.b. so zugreifen:

C++:
int blub = array[5].key; // der key in der 6. (!!) zeile

--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>

Dieser Post wurde am 13.09.2003 um 00:49 Uhr von kronos editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
13.09.2003, 00:47 Uhr
~Luke
Gast


hmmm... das is n bissl schwierig, da ich das jetzt komplett anders gemacht habe:

C++:
void ReadConfig::GetConfig(char *filename)
{
    int i=0;
    CFile file( filename, CFile::modeRead );
    CArchive ar( &file, CArchive::load );
    CString line;
    while( ar.ReadString( line ) )
    {
        SplitString(line, i);    
        i++;
    }
}

Das ist die Funktion die die Datei einliest. Ich habe nun eine Weitere Klasse myConfig angelegt (könnte auch n struct sein fällt mir gerade ein ) die nur 2 CString Variablen "key" und "value" enthält, in der Splitfunktion werden dann die werte in ein array vom typ "myConfig" gespeichert. Das nur im moment noch statisch...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ]     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: