Исправление ошибки 'bad numeric format' при чтении текстового файла в Pascal
В ходе работы с текстовыми файлами на языке программирования Pascal вы столкнулись с ошибкой 106 bad numeric format. Эта проблема связана с неправильным чтением числовых данных из файла. Давайте шаг за шагом разберемся, что привело к этой проблеме и как ее можно исправить.
Описание проблемы
Вы пытаетесь прочитать данные из текстового файла в структуру modulis, которая содержит строковые поля фиксированной длины. Однако при чтении количества модулей N вы столкнулись с ошибкой, указывающей на неправильный формат числа.
Пример кода
program ReadModuliRecord;
uses
sysutils;
type
TModulis = record
kodas: string[4];
pavadinimas: string[30];
skaicius: integer;
kiti: array [1..50] of string;
end;
var
f1: text file of TModulis;
N, i, j: integer;
moduliai: array [1..9] of TModulis; // Предполагаемое количество модулей в файле
begin
Assign(f1, 'path_to_file.txt');
Reset(f1);
ReadLn(f1, N); // Чтение количества модулей из первой строки файла
SetLength(moduliai, N);
for i := 1 to N do begin
Read(f1, moduliai[i].kodas);
Read(f1, moduliai[i].pavadinimas);
Read(f1, moduliai[i].skaicius); // Здесь может произойти ошибка 'bad numeric format'
for j := 1 to moduliai[i].skaicius do
Read(f1, moduliai[i].kiti[j]);
ReadLn(f1); // Пропуск символа перевода строки
end;
Close(f1);
end.
Анализ проблемы
Проблема заключается в том, что вы используете функцию Read для чтения числовых данных из файла, который содержит данные с переменным количеством пробельных символов между полями. Функция Read ожидает фиксированное количество символов до первого пробельного символа или перевода строки.
Подтвержденный ответ
Чтобы исправить ошибку, необходимо изменить способ чтения данных из файла:
Используйте функцию ReadLn для чтения строковых значений, чтобы каждый вызов функции заканчивался на переводе строки.
Преобразуйте строковые значения в числовые с помощью функции StrToInt.
Пример исправленного кода
program ReadModuliRecordFixed;
uses
sysutils;
type
TModulis = record
kodas: string[4];
pavadinimas: string[30];
skaicius: integer;
kiti: array [1..50] of string;
end;
var
f1: text file of TModulis;
N, i, j: integer;
s: string; // Дополнительная переменная для чтения строки
moduliai: array [1..9] of TModulis; // Предполагаемое количество модулей в файле
begin
Assign(f1, 'path_to_file.txt');
Reset(f1);
ReadLn(f1, N); // Чтение количества модулей из первой строки файла
SetLength(moduliai, N);
for i := 1 to N do begin
ReadLn(f1, s); // Чтение полной строки
moduliai[i].kodas := Copy(s, 1, 4);
moduliai[i].pavadinimas := Copy(s, 6, 30).Trim;
moduliai[i].skaicius := StrToInt(Copy(s, 37, Length(s) - 36));
for j := 1 to moduliai[i].skaicius do begin
ReadLn(f1, s);
moduliai[i].kiti[j] := s;
end;
end;
Close(f1);
end.
Альтернативный ответ
Если структура текстового файла позволяет, можно также переформатировать его так, чтобы каждое поле начиналось с новой строки. Это упростит чтение данных и избавит от необходимости использовать дополнительные методы обработки строк.
Заключение
При работе с текстовыми файлами в Pascal важно учитывать формат данных и соответствующим образом настраивать процесс чтения. Использование функций ReadLn для строковых значений и преобразование строк в числа с помощью функции StrToInt помогут избежать ошибки 'bad numeric format'.
Описание контекста: Исправление ошибки "bad numeric format" при чтении текстового файла в Pascal.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.