C чтением в несколько строк из файла - PullRequest
1 голос
/ 23 марта 2011

У меня проблема с чтением нескольких строк целых чисел из файла с использованием стандартного ввода. Файлы выглядят так:

123
423
235
523
..etc

Код, который у меня есть на данный момент:

/*
 * Read in the initial puzzle configuration.
 * Each line is 4 characters long:
 *   Row    as a character '0' .. '9'
 *   Column as character '0' .. '9'
 *   Digit  as character '0' .. '9'
 *   Terminating newline.
 * Exits with an error message if there are syntactic
 * or semantic errors with any configuration line.
 */

void configure(FILE *puzzle_file) {
        int row;
        int column;
        int value;

        while((fscanf(puzzle_file, "%i%i%i\n", row, column, value)) != EOF){
                fscanf(puzzle_file, "%i%i%i\n", row, column, value);
                puzzle[row][column] = value;
                fixed[row][column] = 1;
        }

}

Я пытался использовать fscanf, потому что файл отформатирован правильно (как указано в комментарии выше к функции конфигурации), но я не смог заставить его работать.

Если есть другое, более простое решение этого решения, которое было бы замечательно увидеть.

Язык: C

Edit:

При ошибке компиляции:

xxxxxxx@linus:~/350/sudoku$ make
gcc -c puzzle.c
puzzle.c: In function ‘configure’:
puzzle.c:95: warning: format ‘%i’ expects type ‘int *’, but argument 3 has type ‘int’
puzzle.c:95: warning: format ‘%i’ expects type ‘int *’, but argument 4 has type ‘int’
puzzle.c:95: warning: format ‘%i’ expects type ‘int *’, but argument 5 has type ‘int’
puzzle.c:96: warning: format ‘%i’ expects type ‘int *’, but argument 3 has type ‘int’
puzzle.c:96: warning: format ‘%i’ expects type ‘int *’, but argument 4 has type ‘int’
puzzle.c:96: warning: format ‘%i’ expects type ‘int *’, but argument 5 has type ‘int’
gcc -o sudoku main.o puzzle.o arguments.o

При запуске моей тестовой ошибки:

xxxxxxx@linus:~/350/sudoku$ make test_l2 
./sudoku -e p+s/good_puzzle.txt < p+s/script_good_quit.txt
/bin/sh: line 1:  9143 Segmentation fault      ./sudoku -e p+s/good_puzzle.txt < p+s/script_good_quit.txt
make: *** [good_configured] Error 139

Ответы [ 3 ]

5 голосов
/ 23 марта 2011

У вас есть две проблемы с тем, что вы делаете:

Сначала вы пропустите несколько строк в вашем файле, потому что вы вызываете 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:

Также ознакомьтесь с комментарием к моему ответу, касающимся использования спецификатора ширины для целочисленных значений вместо чтения в символах и их преобразования.

1 голос
/ 23 марта 2011

Предупреждение ясно указывает на то, что может пойти не так во время выполнения -

 puzzle.c:95: warning: format ‘%i’ expects type ‘int *’, but argument 3 has type ‘int’

Поэтому измените

(fscanf(puzzle_file, "%i%i%i\n", row, column, value)

на

(fscanf(puzzle_file, "%i%i%i\n", &row, &column, &value)
// Added & symbol
0 голосов
/ 24 марта 2011

В качестве хорошей практики всегда используйте псевдокод!Глядя на головоломку / спецификацию выше, я бы сделал что-то вроде:

  1. , откройте файл
  2. , захватите первую строку (вероятно, это будет строка), пока выне в EOF
  3. разделить 3 цифры на отдельные переменные
  4. пазл [num1] [num2] = num3
  5. fixed [num1] [num2] = 1
  6. Перейти к # 2

Может быть, в одном или двух местах, так как я не полностью изучил спецификации.

...