Actually, that won't work. It is true that arrays are numbered beginning with 0 and so an array with three elements is x[0], x[1] and x[2). However, when declaring an array, the number you must give is the NUMBER OF elements, not the number of the LAST element. So, in your line, change the 2 to a 3 or it won't compile.
Next topic, on an Arduino, it is seldom (maybe never?) a good idea to use String. They can (will?) cause memory issues and may ultimately end with a crash.
As I said before, personally, I would define my record as a structure, each element of a given length. Such as:
typedef struct user{
char Id[10];
char password[10];
char name[25];}
user;
After declaring that structure that way, you use it just as a data type. So you declare a single instance of that structure like this: user myUser;
You address those individual elements like this: myUser.Id = "GeorgeW"; or if( myUser.name == "George Washington").
That structure can easily be written to and read from SD with
myFile.write((char *)&myUser,sizeof(myUser));
myFile.read((char *)&myUser,sizeof(myUser));
For now, just accept that it has to be written that way and don't worry about what the (char *)& means. Pointers are a more advanced topic than this thread was meant to handle.
So, back to ISAM. That stands for Indexed Sequential Access Method and that is exactly what we have talked about up to this point except for the "Indexed" part. See if you can get it working as discussed up to this point and we can go into indexing the records later if you need to.