У вас есть:
while (fscanf(data_file,"%05d %[^\n]10s %05f", &id, desc, &price) != EOF)
Возможно, вам нужно:
while (fscanf(data_file,"%5d %40[^\n0-9] %5f", &id, desc, &price) == 3)
Значение 40
основано на размере desc
(вы указываете на единицу меньше в строке форматачем в длине, объявленной для массива).Обратите внимание, что набор сканирования %[…]
сам по себе является преобразованием.10s
в вашей версии ищет конкретные символы 1
, 0
и s
(и это не удастся - следующим символом будет символ новой строки или конец файла, поскольку вы не указалиразмер для набора сканирования).И тест должен быть на ожидаемое количество конверсий;что-либо еще является ошибкой какого-либо рода.
Если имена регистров могут содержать цифры, вы попадаете в ловушку, потому что REGISTER XVY
- это 12 символов, считая пробел (что противоречит вашему утверждению, что имена регистров имеют длину до 10 символов),Указание любого меньшего значения, чем 12, в %12[^\n0-9]
не приведет к преобразованию этого имени и следующего числа, поскольку оно оставит нецифровые символы во входных данных.
Если у вас должны быть цифры в имени регистра, у вас естьпринять другую стратегию.Вы прочитали строку, затем удалили первые 5 цифр и конвертировали их, удалили последние 5 цифр и конвертировали их, и взяли то, что осталось в качестве имени регистра, возможно, убрав начальные и конечные пробелы.