Ошибки чтения данных из файла в Pascal: правильное использование ReadLn для строк и чисел
Вопрос, описанный пользователем, касается чтения данных из файла в формате, содержащем строки и числа, с использованием процедуры ReadLn. Пример входного файла выглядит следующим образом:
Имя Фамилия Число1 Число2
Пример строки из файла: Bart Simpson 86.5 9.85.
Проблема заключается в том, что при попытке использовать ReadLn для чтения данных в отдельные переменные, возникает ошибка. Пользователь пытался использовать следующий код:
ReadLn(data, name[:array of string[25]]), surname(:array of string[25]), numeric1(:_real_), numeric2(:_real_));
При изменении типов числовых значений на целочисленные (integer), программа начинает работать, но первый числовой параметр получает оба числовых значения, а второй остается пустым.
Подтвержденный ответ
Проблема заключается в том, что процедура ReadLn не может корректно обработать входные данные, содержащие строки и числа, разделённые пробелами, поскольку сама строка с данными интерпретируется как единое поле.
Для решения проблемы можно использовать специальный символ, который будет обозначать конец строки, например, Ctrl+Z. Это работает в среде Delphi. В случае, если входной файл создается автоматически и изменять его формат не представляется возможным, можно использовать цикл для чтения строк символ за символом до тех пор, пока не будет встречен пробел.
Пример кода для чтения строк и чисел в отдельные переменные:
procedure TForm1.Button1Click(Sender: TObject);
var
f: TextFile;
fn: string;
Lines: Integer;
i: Integer;
first, last: string;
R1, R2, Total: Real;
function ReadName: string;
var
c: Char;
begin
Result := '';
repeat
Read(f, c);
Result := Result + c;
until c = ' ';
end;
begin
fn := 'data.txt';
AssignFile(f, fn);
Reset(f);
Read(f, Lines);
Readln(f);
Total := 0;
for i := 1 to Lines do begin
first := ReadName;
last := ReadName;
Read(f, R1, R2);
// Обработка данных
Total := Total + R1 * R2;
Readln(f);
end;
// Обработка итоговой суммы
CloseFile(f);
end;
В этом примере функция ReadName читает символы из файла f до тех пор, пока не будет найден пробел, который указывает на конец строки.
Альтернативный ответ
Если входной файл не может быть изменен, и в нем строки и числа разделены пробелами, использование ReadLn напрямую не представляется возможным. В этом случае необходимо использовать другой подход, например, чтение строк и чисел в цикле с использованием стандартной процедуры Read.
Заключение
Использование ReadLn для чтения строк и чисел из файла требует особого внимания к формату входных данных. В случае, если формат входного файла не соответствует требованиям ReadLn, необходимо использовать альтернативные методы чтения данных, такие как циклическое чтение символов или использование специальных символов для обозначения конца строки.
Вопрос связан с проблемами чтения данных из файла в языке программирования Pascal, используя процедуру `ReadLn` для корректной обработки строк и чисел, разделенных пробелами.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.