Нарушение прав доступа при использовании fscanf_s - PullRequest
4 голосов
/ 27 мая 2011

Я хочу прочитать файл в определенном формате, поэтому я использую fscanf_s и цикл while. Но как только fscanf_s обработан, программа вылетает с нарушением прав доступа (0xC0000005).

Вот код:

FILE *fp;
errno_t err = fopen_s(&fp, "C:\\data.txt", "r");

if (err != 0)
    return 0;

int minSpeed = 0;
int maxSpeed = 0;
char axis = '@';

while(!feof(fp)) 
{
    int result = fscanf_s(fp, "%c;%d-%d\n", &axis, &minSpeed, &maxSpeed);

    if (result != 3)
        continue;
}

fclose(fp);

Содержимое файла основано на строках, например:

-;10000-20000
X;500-1000
S;2000-2400

Может ли кто-нибудь мне помочь?

Ответы [ 2 ]

9 голосов
/ 27 мая 2011

Очевидно, fscanf_s() нужен параметр размера после адреса переменной

fscanf_s(fp, "%c;%d-%d\n", &axis, 1, &minSpeed, &maxSpeed);
/* extra 1 for the size of the   ^^^ axis array */

Но я предлагаю вам не использовать функции *_s: они хуже, чемфункции с простыми именами - они требуют одинаковых проверок и позволяют вам чувствовать себя в безопасности, когда это не так.Я предлагаю вам не использовать их из-за ложного чувства безопасности и того факта, что они недоступны во многих реализациях, из-за чего ваши программы работают только на ограниченном подмножестве возможных машин.*

fscanf(fp, "%c;%d-%d\n", &axis, &minSpeed, &maxSpeed);
/* fscanf(fp, "%1c;%d-%d\n", &axis, &minSpeed, &maxSpeed); */
/* default 1   ^^^    same as for fscanf_s                 */

И использование feof() неверно.
fscanf() возвращает EOF при возникновении ошибки (ошибка конца файла или совпадения или ошибка чтения ...).

Вы можете использовать feof(), чтобы определить причину сбоя fscanf(), а не проверить, произойдет ли сбой при следующем вызове.

/* pseudo-code */
while (1) {
    chk = fscanf();
    if (chk == EOF) break;
    if (chk < NUMBER_OF_EXPECTED_CONVERSIONS) {
        /* ... conversion failures */
    } else {
        /* ... all ok */
    }
}
if (feof()) /* failed because end-of-file reached */;
if (ferror()) /* failed because of stream error */;
0 голосов
/ 27 мая 2011

Если вы считаете, что файл (data.txt) существует, ваше приложение, вероятно, не работает с текущим каталогом, в котором находится файл.Это может привести к сбою fopen_s ().

...