C: fscanf стирает значения целочисленных переменных? - PullRequest
0 голосов
/ 06 октября 2010

У меня есть программа на C, которая сталкивается с ошибками при входе в цикл while.

Я инициализирую переменную (gmentcount) и записываю в нее, используя fscanf, и присваиваю ей значение 4 (это работает)

int fragmentCount;
if ((fscanf(fp, "%i", &fragmentCount)) == 1) {
   ...
}

Однако, когда я пытаюсь получить к ней доступ через некоторое времяЦикл ниже, fragCount = 0

while ((fscanf(fp, "%[#]", discards)) != EOF) {
   printf(fragmentCount); // <- pseudocode
}

. Для краткого эксперимента я попытался убрать fscanf в качестве условного теста для цикла while, а фрагментCount был правильным значением (4).

Почему это так?Как я могу избежать этого?

Ответы [ 2 ]

1 голос
/ 06 октября 2010

Как объявлено discards?Возможно, что fscanf читает больше данных, чем есть в discards, что может перезаписать значение других переменных.

Использование формата '% [' без ширины поля - плохая идея - это оставляет вашу программу открытой для ошибок переполнения буфера .

0 голосов
/ 06 октября 2010

fscanf читает значение из файла и интерпретирует его в соответствии со строкой формата.Строка формата «% i» неизвестна (возможно, вы имели в виду «% d»?) В соответствии с http://www.cplusplus.com/reference/clibrary/cstdio/fscanf/,, поэтому вы вряд ли прочитаете ожидаемое значение.

Помимо файла FILE*и строка формата, все параметры для fscanf являются параметрами out, что означает, что значение, которое они содержат перед вызовом fscanf, не имеет значения и может быть заменено.

...