If you aren't storing the word data in a grid yet, I'd suggest converting to that, as it will make stuff easier.
The file format gives you the location of each number in the crossword, so based on the "cursor's" location you can query the index of the word that the user is typing in.
The file format also specifies the direction that the words flow in. Combining this data, and the fact that the words flow either left-to-right or top-to-bottom, you can easily increment/decrement the cursor position.
I'm not sure how you want the typing to work (i.e. can the user choose an arbitrary cell and type there), but you could just store the current direction when the user starts typing in a word starting cell.
Here's some really rough pseudo code:
int CursorX, CursorY = 0;
int XDir, YDir = 0;
void OnKey(Key key) {
if (key != Backspace) {
// Gets the index of the word that starts here. Probably a lookup from some table.
wordStart = QueryWordStartIndex(CursorX, CursorY);
if (wordStart > 0) // A word starts here, update direction.
{
if (WordDirection(wordStart) == "Across") XDir = 1, YDir = 0;
else XDir = 0, YDir = 1;
}
Grid[CursorY][CursorX] = key.Char;
// TODO: Check if the pos is valid here etc.
CursorX += XDir;
CursorY += YDir;
}
else {
Grid[CursorY][CursorX] = "";
CursorX -= XDir;
CursorY -= YDir;
}
}
You'll probably need to handle a lot of different cases and decide how to actually set CursorX/Y
to a word start position.
Now, if the player starts typing in a grid where there isn't a word starting, this will be a lot harder if not impossible. In some cases you might be able to use empty cells around the cursor position to determine what word the player is trying to fill in (i.e. if there are empty cells in only one direction, that's the direction the cursor should be moved), but there will be situations where you can't deduce this information. In those situations, I'd just wait for the player to move the cursor to some direction, and remember this direction for convecutive character entries.