Задача 1: Ввод массива в стек, как A[INT_MAX]
является плохой практикой; он выделяет необоснованное количество места в стеке (и будет разбиваться на машинах, где INT_MAX
большой по отношению к размеру памяти). Получите размер файла, затем malloc
место для него.
fseek(fp, SEEK_END);
long size = ftell(fp);
rewind(fp);
char *A = malloc((size_t) size); // assumes size_t and long are the same size
if (A == NULL) {
// handle error
}
Задача 2: fscanf
неправильно. Если вы настаиваете на использовании fscanf
(который не является хорошим способом, чтобы прочитать весь файл, см проблемы 4), вы должны изменить:
fscanf("fp,%c",&c);`
должен быть
int count = fscanf(fp, "%c",&c);
if (count <= 0)
break;
Проблема 3: Ваш x
счетчик не инициализируется. Если вы настаиваете на использовании fscanf
, вы должны инициализировать его:
int x = 0;
Задача 4: fscanf
неправильный путь, чтобы прочитать весь файл. Предполагая, что вы выяснили, как большой файл (см задачу 1), вы должны прочитать файл с fread
, как это:
int bytes_read = fread(A, 1, size, fp);
if (bytes_read < size) {
// something went wrong
}
Мой первоначальный ответ, и хорошее общее правило:
Вам нужно проверить возвращаемое значение, потому что ваше значение c
никогда не может быть EOF
, потому что EOF
- значение int
, которое не соответствует char
. (Вы должны всегда проверять возвращаемые значения, даже когда кажется, что ошибки не должно произойти, но я не всегда делал в коде выше.)
От http://www.cplusplus.com/reference/cstdio/fscanf/:
Возвращаемое значение
При успешном выполнении функция возвращает количество успешно заполненных элементов списка аргументов. Этот счетчик может соответствовать ожидаемому количеству элементов или меньше (даже нулю) из-за соответствия сбоя, ошибки чтения или досягаемости конца файла.
Если при чтении происходит ошибка чтения или достигнут конец файла, устанавливается правильный индикатор (feof или ferror). И, если это произойдет до того, как данные будут успешно прочитаны, возвращается EOF.
Если ошибка кодирования происходит при интерпретации широких символов, функция устанавливает errno в EILSEQ.
вы можете вставить 'чек NULL' для' 'fp' после fopen'? Кроме того, лучше написать 'int x = 0;' –
Использовать отладчик. –
'A [INT_MAX]' выглядит немного консервативным. Является ли ваш локальный стек таким большим? – usr2564301