Программа читает только первый 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()
петля.