Вопрос, поднятый пользователем, связан с ошибкой I/O 102, возникающей при попытке записи данных в файл в среде Delphi. Ошибка связана с неправильным использованием функций ввода-вывода в Object Pascal. Давайте разберемся с причиной возникновения ошибки и найдем решение.
Пример кода, вызывающего ошибку I/O 102:
procedure TForm1.Button1Click(Sender: TObject);
var
F: Array[1..20] of Text; // 20 полей, по одному файлу для каждого
FirstName, FName: string; // Путь к файлу, Поле
begin
FirstName := ExtractFilePath(ParamStr(0)) + 'User\Identity\FirstName.txt'; // Путь к файлу
FName := Edit1.Text; // Данные для записи, полученные из Edit-контрола
AssignFile(F[1], FirstName); // Ошибка в этом месте - использование массива переменных файла
Rewrite(F[1], FirstName); // Второй аргумент Rewrite не нужен и некорректен
Writeln(F[1], FName);
CloseFile(F[1]);
end;
Основные проблемы кода:
Использование массива переменных файла F не является необходимым для данной задачи.
Второй аргумент функции Rewrite не требуется, и его использование приводит к ошибке компиляции.
Необходимо проверить доступ на запись в директорию, указанную в переменной FirstName.
Рекомендации по устранению ошибки:
Используйте одну переменную типа Text вместо массива.
Убедитесь, что директория, в которую будет записан файл, существует. Для ее создания используйте функцию ForceDirectories.
Удалите второй аргумент из функции Rewrite.
Исправленный код:
procedure TForm1.Button1Click(Sender: TObject);
var
FileName, FName: string; // Путь к файлу и данные для записи
begin
FileName := ExtractFilePath(ParamStr(0)) + 'User\Identity\FirstName.txt'; // Путь к файлу
FName := Edit1.Text; // Данные для записи
ForceDirectories(ExtractFilePath(FileName)); // Создание директории, если она не существует
AssignFile(File, FileName);
Rewrite(File, 1); // 1 - это параметр, указывающий режим файла, второй аргумент не нужен
Writeln(File, FName);
CloseFile(File);
end;
Альтернативный подход с использованием TStringList:
В современных приложениях рекомендуется избегать использования устаревших функций ввода-вывода. Вместо этого можно использовать класс TStringList, который является более удобным и гибким инструментом для работы с текстом.
uses
SysUtils, Classes;
procedure TForm1.Button1Click(Sender: TObject);
var
FileName: string;
SL: TStringList;
begin
FileName := ExtractFilePath(ParamStr(0)) + 'User\Identity\FirstName.txt';
SL := TStringList.Create;
SL.Add(Edit1.Text); // Добавление данных из Edit-контрола в список
SL.SaveToFile(FileName);
SL.Free;
end;
Заключение:
Ошибка I/O 102 в Delphi обычно возникает из-за неправильного использования функций ввода-вывода. В представленных примерах кода исправлены основные ошибки, и теперь программа должна корректно записывать данные в файл. В современных проектах рекомендуется использовать более современные подходы и классы, такие как TStringList, для упрощения работы с текстом и уменьшения вероятности возникновения ошибок.
Вопрос касается устранения ошибки ввода-вывода 102 при работе с файлами в среде разработки Delphi, связанной с неправильным использованием функций ввода-вывода в Object Pascal.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.