Программа читает только первый int из текстового файла C

В этой части моей программы предполагается прочитать набор чисел типа int из "example112.txt" и воспроизвести их через осциллятор для создания мелодии. Он читает только первый номер Int в текстовом файле снова и снова вместо чтения до конца файла, таким образом, выводит ту же заметку, пока я не выйду из программы вручную. Что мне здесь не хватает? Благодарю.

  if (choice == 'e')
    {
       textFilePointer4 = fopen("example112.txt", "r");

        while(!feof(textFilePointer4))
        {

            float frequency;
            //velocity conversion
            float amplitude = input.velocity/127.0;

            //frequency conversion
            frequency = 440 * pow(2, (input.notes-69) /12.0);
            fscanf(textFilePointer4, " %d %d\n", &input.notes, &input.velocity);
            printf(" %d %d\n\n", input.notes, input.velocity);
            aserveOscillator(0, frequency, amplitude, 0);
            aserveSleep(500);
            aserveOscillator(0, 0, 0, 0);
            fclose(textFilePointer4);

        }
    }

1 ответ

Решение

В вашей программе есть несколько распространенных ошибок, в основном из-за допущений и отсутствия проверки ошибок, прежде всего while (!feof(file)) всегда ошибается, и самое главное, что вы не проверяете fscanf() возвращаемое значение, которое я считаю неправильным.

когда fscanf() во второй раз происходит сбой, значения, которые были сохранены в структуре, не изменятся, что приведет к описанному вами поведению.

Решения решают обе проблемы одновременно

while (fscanf(textFilePointer4, " %d %d\n", &input.notes, &input.velocity) == 2)

вместо while (!feof( ...,

Еще одна проблема - эта линия

float amplitude = input.velocity/127.0;

что может быть проблемой, если вы не инициализировали input.velocity перед входом в цикл, это тоже будет решено с этим предложением.

Кроме того, это fclose(textFilePointer4); должен быть за пределами while() петля.

Другие вопросы по тегам