Как я могу сделать fscanf более «строгим» или совершенно другим способом решения моей дополнительной строки? - PullRequest
1 голос
/ 19 декабря 2011

У меня есть небольшой фрагмент кода, который читает файл, и я хочу найти точное совпадение для строки, но fscanf также читает аналогичную строку. Как я могу сделать его более строгим, то есть чувствительным к регистру или читающим точное совпадение для строки?

Фрагмент ниже:

while(fgets(spectral_buffer,MAX_SIZE1,fr) != NULL)
{
    if (fscanf(fr, "Data in DB matching with precursor %f:\n",&prec) != 0) {
        spectral_precursor[teller] = prec;
        printf("%f\n",spectral_precursor[teller]);
        prec_teller++; 
    }
    teller++;
}  

Пример входного фрагмента:

Data in DB matching with precursor 924.7: /* This should be read */
<Lots of lines regarding the element in DB> 
Data in DB matching with precursor 1228.4: /* This should be read */
<Lots of lines regarding the element in DB>
No data in DB matching with precursor 123.4: /* This shouldn't be read */
<No lines following this>

Вывод, который я получаю для этого фрагмента:

924.700012
1228.400024
1228.400024

Проблема здесь в том, что строка 1228 является «уникальной» во входном файле, поэтому либо она каким-то образом читает строку 123.4, поскольку она содержит (неправильные случаи), что искомая строка или fscanf работает иначе, чем я думаю.

Заранее спасибо за ваше время;)

1 Ответ

1 голос
/ 19 декабря 2011

Проверьте правильность возвращаемого значения fscanf:

if (fscanf(fr, "Data in DB matching with precursor %f:\n",&prec) == 1) {

В противном случае ваш цикл fscanf может встретиться с EOF и возвратить EOF, что приведет к ложному выходу, поскольку EOF != 0 истинно.

...