There are so many things wrong with that code that it is hard to know where to begin.
char* val = "0";
This points to the character 0 stored somewhere in memory.
val[0] = file.read();
while(val >=0){
val[0]=file.read();
This attempts to overwrite the one character that val points to. The while loop will always be true, because val is an address, and that address is not 0. So, you read another byte into the same memory location, overwriting the previous one.
char *str;
while ((str = strtok_r(val, ";", &val)) != NULL) // delimiter is the semicolon
int a = atoi(str);
Then, you try to pass a non-NULL-terminated array to a function that expects a NULL terminated array of chars. Fail!
You need to define an array of fixed size, NOT using a pointer. You need to read data from the card until some end-of-record marker is read, or until the end-of-file marker is encountered. Collect the characters in the array as they are read, adding a NULL after each character added to the array.
When the end of record marker is read, then you want to parse the data, using strtok, not strtok_r.