PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Hilfe bei stringmanipulation



Armads
09.09.2009, 01:49
Guten Nacht,

ich hab seit langen mal wieder beschlossen etwas schwieriges zu probieren,
und hab mich nun an ein txt-basierendes-datenbank-verarbeitungs-tool gesetzt.
Njoa leider scheitere ich nun beim einlesen der daten ~.~".

Das ist die Syntax der Datenbank

ID,AegisName,Name,Type,Buy,Sell,Weight,ATK,DEF,Ran ge,Slots,Job,Upper,Gender,Loc,wLV,eLV,Refineable,V iew,{ Script },{ OnEquip_Script },{ OnUnequip_Script }
Und so sieht ein eintrag aus:

501,Red_Potion,Red Potion,0,50,,70,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(45,65),0; },{},{}Ich hab zwar herausgefunden das die funktion, die ich zum aufteilen der spalten brauche strtok() ist. Leider hat die funktion den negativen effekt das sie ohne erneutes aufrufen der funktion, gleich das nächste token sucht wenn es beim ersten keine daten findet.

Ich weis echt nicht weiter und hoffe das ihr mir vielleicht einen kleinen denkanstoss geben könntet

P.S Der Source is sehr experimentel also is noch nichts festgelegt.

Referenz link, strtok():
http://cplusplus.com/reference/clibrary/cstring/strtok/

Source:

#include <cstdlib>
#include <iostream>
#include <cstring>

using namespace std;

int main(int argc, char *argv[])
{
/* ============================ */
/* Deklaration und Definitionen */
/* ============================ */
#define BUFFER_SIZE 1024

FILE * pFILE;

char Buffer[BUFFER_SIZE];
char Sell[BUFFER_SIZE];
char *Puffer;


/* ============================ */
/* Main code */
/* ============================ */

pFILE = fopen("item_db.txt", "r");
puts("Die File wurde geoeffnet!");

//puts("test1");

if(pFILE == NULL)
{
puts("Fehler beim oeffnen der Datei!");
}

else
{
for(int i = 1; i != 100;)//while(!feof(pFILE))
{
//printf("%i\n",i);
fgets(Buffer, BUFFER_SIZE, pFILE);

if(strcspn(Buffer, "/") != 0)
{
for(int j = 1; j != 23 && Puffer != NULL ; j++)
{
switch(j)
{
case 1:
Puffer = strtok(Buffer, ",");

break;
case 2:
Puffer = strtok(NULL, ",");
break;
case 3:
Puffer = strtok(NULL, ",");
break;
case 4:
Puffer = strtok(NULL, ",");
break;
case 5:
Puffer = strtok(NULL, ",");
break;
case 6:
Puffer = strtok(NULL, ",");
break;
case 7:
Puffer = strtok(NULL, ",");
break;
case 8:
Puffer = strtok(NULL, ",");
break;
case 9:
Puffer = strtok(NULL, ",");
break;
case 10:
Puffer = strtok(NULL, ",");//
break;
case 11:
Puffer = strtok(NULL, "{");//
break;
case 12:
Puffer = strtok(NULL, "{");//
break;
case 13:
Puffer = strtok(NULL, "{");//
break;
case 14:
Puffer = strtok(NULL, ",");
break;
case 15:
Puffer = strtok(NULL, ",");
break;
case 16:
Puffer = strtok(NULL, ",");
break;
case 17:
Puffer = strtok(NULL, ",");
break;
case 18:
Puffer = strtok(NULL, ",");
break;
case 19:
Puffer = strtok(NULL, ",");
break;
case 20:
Puffer = strtok(NULL, "{");
break;
case 21:
Puffer = strtok(NULL, "{");
break;
case 22:
Puffer = strtok(NULL, "{");
break;
default:
break;
}

if(Puffer == "(null)")
{
printf("(null):%i\n",j);
}

printf("%s\n", Puffer);
}
i++;
}
}
}

fclose(pFILE);
puts("Die File wurde geschlossen!");

system("PAUSE");
return EXIT_SUCCESS;
}

Ancient87
09.09.2009, 07:00
Ich wuerde das beinhart selber parsen ist eigentlich recht simpel du checkst den string einfach character fuer charcater and baust dir eine kleine state machine je nachdem in welchem state du bist hat ein token eine andere Bedeutung



char** parse(char* inp)
{
char entries[200][200]; // This will hold all the parsed attributes
int entry = 0; // Starting entry
char* pos = inp; // Initialisation
char* start = inp;
while(*pos != '\0') // Do until end of Strong reached
{
while(*pos != ',') // One attribute
{
pos++;
}

int length = pos - start;
if(length >= 1)
{
// We got a ,
memcpy(entries[entry][0], start, pos - start)
entries[entry++][pos-start+1] = '\0' // null terminate string
}
else
{
// Empty attribute
entries[entry++] = '\0'
}
start = pos;
}
}
return entries;
}
Hab das schnell zusammengehackt denke Ansatz ist klar aber wirst wohl ein bisschen debuggen muessen