Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как исправить ошибку "bad number format" в Pascal при чтении числовых данных из файла

Delphi , Синтаксис , Массивы

Ошибка "bad number format" в Pascal при чтении данных из файла

Разработчики, работающие с языками программирования, такими как Pascal, иногда сталкиваются с ошибками, когда пытаются прочитать числовые данные из файла. Одна из таких ошибок — "bad number format". Это происходит, когда программа ожидает получить числовые данные, но вместо этого получает строку, не соответствующую формату числа.

Пример кода, вызывающего ошибку

program s;
type
  info = record
    name, surname: string;
    min, sek: integer;
  end;
  type arrays = array[1..50] of info;
var
  c, b: text;
  A: arrays;
  gr_sk, grup_dal: integer;
begin
  assign(c, 'info.txt');
  reset(c);
  read(c, gr_sk); // Ожидается чтение числа, но читается строка "3"
  read(c, grup_dal); // Аналогично, ожидается число, но читается строка "4"
  // ... Дальше следует чтение записей info, где также возникает ошибка
  read(c, A[id].sek); // Ошибка "bad number format", так как sek ожидает число, а получает строку
  // ... Остальной код программы
end.

Файл info.txt

3
4
yhgf
4

Описание проблемы

При выполнении программы возникает ошибка "bad number format" на строке, где происходит чтение переменной sek типа integer. Это происходит потому, что в файле info.txt после чисел следуют строки, которые не могут быть интерпретированы как числа.

Решение проблемы

Приведенный в вопросе код использует переменные c и b типа text, что не позволяет корректно читать числовые данные. Вместо этого следует использовать переменные типа file, которые могут быть связаны с записями.

type
  info = record
    name, surname: string;
    min, sek: integer;
  end;
  type arrays = array[1..50] of info;
var
  f: file of info; // Используем file вместо text
  A: arrays;
  gr_sk, grup_dal: integer;
begin
  assign(f, 'info.txt');
  reset(f);
  // Теперь чтение происходит корректно, так как f связан с типом info
  read(f, A[id]);
  // ... Остальной код
end.

Альтернативное решение

Если по каким-то причинам использование переменной типа file невозможно, можно читать данные в строку, затем проверять, что строка представляет собой число, и только после этого преобразовывать её в числовой тип. В Pascal для этого можно использовать процедуру val.

var
  sekStr: string;
begin
  readln(c, sekStr); // Чтение строки
  gr_sk := val(sekStr); // Преобразование строки в число
end.

Важные замечания

  • Необходимо обратить внимание на разделители строк (CR и LF), которые могут вызывать проблемы при чтении данных.
  • В случае сомнений можно использовать readln(c, ) для чтения следующих символов и вывода их кодов на экран, чтобы убедиться в корректности чтения.

Вывод

Ошибка "bad number format" в Pascal при чтении числовых данных из файла обычно вызвана несоответствием формата данных, ожидаемых программой, и фактически присутствующих в файле. Исправление ошибки требует либо корректировки формата файла, либо корректного чтения данных с последующей валидацией и преобразованием в числовой формат.

Создано по материалам из источника по ссылке.

Ошибка 'bad number format' в Pascal возникает при попытке прочитать числовые данные из файла, если вместо числа программа читает строку, не соответствующую формату числа.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Массивы ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-03-14 12:36:15/0.0015358924865723/0