У вас есть две проблемы с тем, что вы делаете:
Сначала вы пропустите несколько строк в вашем файле, потому что вы вызываете fscanf в цикле while, а затем сразу после проверки условия цикла. Вы должны вызывать его только один раз в состоянии цикла while.
while((fscanf(puzzle_file, "%i%i%i\n", row, column, value)) != EOF){
// fscanf(puzzle_file, "%i%i%i\n", row, column, value); REMOVE THIS!
puzzle[row][column] = value;
fixed[row][column] = 1;
}
Во-вторых, вы бы хотели прочитать каждое из этих целых чисел как отдельные символы, т.е. %c%c%c
вместо %i%i%i
и преобразовать коды этих символов в целочисленные значения. то есть. вычитать ((int) ch - 48), где ch - один из символов, прочитанных fscanf.
UPDATE:
Вы также передаете неправильные значения в fscanf, вы хотите передать ячейку памяти ваших переменных, а не их значения.
char row,value,column;
fscanf(puzzle_file, "%c%c%c\n", &row, &column, &value);
ОБНОВЛЕНИЕ 2:
Также ознакомьтесь с комментарием к моему ответу, касающимся использования спецификатора ширины для целочисленных значений вместо чтения в символах и их преобразования.