I have a variable in which I read a .txt file. The file looks like this:
Element1|Element2|Element3|...|ElementLast#Element1|Element2|Element3|...|ElementLast#Element1|Element2|Element3|...|ElementLast#Element1|Element2|Element3|...|ElementLast
Now what I wanna do is, to get every 'Element1' and check if it is equal to an specific string.
I read much about the function strtok()
and I tried to use it.
This is my function: (id is this special string, I convert it during the function.)
int PLUexists(int id) {
char idc[3];
sprintf(idc, "%d", id);
printf("%s", idc);
/* My Main String */
FILE *plu = fopen("kassa_plu.txt", "r");
char pluc[2000];
while( fgets(pluc, sizeof(pluc), plu) !=0 );
/* My Token */
char *token;
/* get first line */
token = strtok(pluc, "#");
while( token != NULL ) {
printf(" %s \n", token);
// Without that block, I get all lines seperated...
char t[255];
strcpy(t, token);
if ( strcmp(strtok(t, "|"), idc) == 0) {
printf("Jep");
return 1;
}
// End 'block'
token = strtok(NULL, "#");
}
return 0;
}
Now if I just print out the first token (and repeat it), I get all of my lines seperated (see underneath) but when I also parse the code between the printf(" %s \n", token);
and token = strtok(NULL, "#");
it won't work.
Without the block:
Element1|Element2|Element3|...|ElementLast
Element1|Element2|Element3|...|ElementLast
Element1|Element2|Element3|...|ElementLast
Element1|Element2|Element3|...|ElementLast
With it:
Element1|Element2|Element3|...|ElementLast
Element2|Element3|...|ElementLast
Element3|...|ElementLast
...|ElementLast
ElementLast
Your main problem is that when, inside the loop, you call
strtok()
with a non-null first argument, you thereby tell that function to abandon the previous tokenization (by#
delimiters) it was working on to perform a new tokenization. You could consider usingstrtok_r()
instead, which allows you to maintain state for multiple tokenizations at once, but since you want the first token on each line and only the first, I'd consider not usingstrtok[_r]()
in the inner loop at all.For example, here's a similar approach based on
strchr()
: