Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Помогите с проблемой, не понимаю почему при нажатии на кнопку ничего не выводится в ListBox, хотя данные в файле есть

Кристина Пивикова Ученик (99), открыт 2 недели назад
type TPred = record
Naz:string[50];
Vac:string[50];
end;
type TPerson = record
FIO:string[50];
spec:string[50];
end;
Vacansii=file of TPred;
Vacansii2=file of TPred;
Anket=file of TPred;
Anket2=file of TPred;
var
g:TPred;
e:TPerson;
f2:TextFile;
f22:TextFile;
f1:TextFile;
f11:TextFile;

{ TForm4 }

procedure TForm4.Button1Click(Sender: TObject);
begin
AssignFile(f2,'Vacansii');
AssignFile(f22, 'Vacansii2');
{$I-}
Reset(f2);
Rewrite(f22);
{$I+}
while not EOF(f2) do
begin
readln(f2, g.naz);
readln(f2, g.vac);
writeln(f22, g.naz);
writeln(f22, g.vac);
end;
CloseFile(f2);
CloseFile(f22);
//ФИО
AssignFile(f1,'Anket');
AssignFile(f11, 'Anket2');
{$I-}
Reset(f1);
Rewrite(f11);
{$I+}
while not EOF(f1) do
begin
readln(f1, e.fio);
readln(f1, e.spec);
writeln(f11, e.fio);
writeln(f11, e.spec);
if e.spec=Edit1.text then
begin
ListBox1.Items.add(e.fio);
end;
end;
CloseFile(f1);
CloseFile(f11);

end;
2 ответа
test1231919 11 Знаток (411) 2 недели назад
1. **Неправильное использование типов файлов**: Вы объявили типы файлов как `file of TPred`, но затем пытаетесь использовать их как текстовые файлы, читая и записывая строки с помощью `readln` и `writeln`.
2. **Неверное использование инструкций `Reset` и `Rewrite`**: Вы используете `Reset` и `Rewrite` для работы с файлами, но не проверяете статус операции после их вызова.
3. **Неправильное чтение и запись файлов**: Использование процедур `readln` и `writeln` не подходит для файлов, объявленных как `file of TPred`. Для этого нужно использовать процедуры `read` и `write`.

### Исправления

1. **Объявите типы файлов как текстовые**: Если вы хотите работать с текстовыми файлами, объявите их как `TextFile`.
2. **Используйте правильные процедуры для чтения и записи данных**: Используйте `read` и `write` для файлов типа `file of`.
3. **Проверьте статус операций ввода-вывода**: Обрабатывайте ошибки ввода-вывода, чтобы понимать, что происходит в случае неудачи.

### Исправленный код

```pascal
type
TPred = record
Naz: string[50];
Vac: string[50];
end;

TPerson = record
FIO: string[50];
spec: string[50];
end;

Vacansii = file of TPred;
Anket = file of TPerson;

var
g: TPred;
e: TPerson;
f2, f22: Vacansii;
f1, f11: Anket;

procedure TForm4.Button1Click(Sender: TObject);
begin
// Работа с файлами вакансий
AssignFile(f2, 'Vacansii.dat');
AssignFile(f22, 'Vacansii2.dat');
{$I-}
Reset(f2);
if IOResult <> 0 then begin
ShowMessage('Ошибка открытия файла Vacansii.dat');
Exit;
end;
Rewrite(f22);
if IOResult <> 0 then begin
ShowMessage('Ошибка открытия файла Vacansii2.dat');
CloseFile(f2);
Exit;
end;
{$I+}

while not EOF(f2) do
begin
Read(f2, g);
Write(f22, g);
end;

CloseFile(f2);
CloseFile(f22);

// Работа с файлами анкет
AssignFile(f1, 'Anket.dat');
AssignFile(f11, 'Anket2.dat');
{$I-}
Reset(f1);
if IOResult <> 0 then begin
ShowMessage('Ошибка открытия файла Anket.dat');
Exit;
end;
Rewrite(f11);
if IOResult <> 0 then begin
ShowMessage('Ошибка открытия файла Anket2.dat');
CloseFile(f1);
Exit;
end;
{$I+}

while not EOF(f1) do
begin
Read(f1, e);
Write(f11, e);
if e.spec = Edit1.Text then
begin
ListBox1.Items.Add(e.FIO);
end;
end;

CloseFile(f1);
CloseFile(f11);
end;
```

### Пояснения

1. **Файлы теперь открываются с правильным расширением (`.dat`)**: Предполагается, что файлы содержат бинарные данные записанные в форматах `TPred` и `TPerson`.
2. **Использование процедур `Read` и `Write` для бинарных файлов**: Для работы с файлами типов `Vacansii` и `Anket` используются процедуры `Read` и `Write`.
3. **Обработка ошибок ввода-вывода**: Добавлена обработка ошибок после вызовов `Reset` и `Rewrite`.
Татьяна Просветленный (28796) 2 недели назад
Ваш код содержит несколько ошибок и недочетов, которые могут привести к тому, что данные не отображаются в ListBox1. Вот несколько изменений, которые могут помочь:
  1. Убедитесь, что файлы существуют и доступны для чтения.
  2. Убедитесь, что формат данных в файлах соответствует ожидаемому.
  3. Проверьте, что условие if e.spec=Edit1.text then выполняется корректно.
  4. Используйте правильные процедуры для работы с файлами в формате записи, так как вы работаете с текстовыми файлами и файлами записей.
 type  
TPred = record
Naz: string[50];
Vac: string[50];
end;

TPerson = record
FIO: string[50];
Spec: string[50];
end;

var
g: TPred;
e: TPerson;
f2: File of TPred;
f22: File of TPred;
f1: File of TPerson;
f11: File of TPerson;

procedure TForm4.Button1Click(Sender: TObject);
begin
// Работа с вакансиями
AssignFile(f2, 'Vacansii.dat');
AssignFile(f22, 'Vacansii2.dat');
Reset(f2);
Rewrite(f22);
while not EOF(f2) do
begin
Read(f2, g);
Write(f22, g);
end;
CloseFile(f2);
CloseFile(f22);

// Работа с анкетами
AssignFile(f1, 'Anket.dat');
AssignFile(f11, 'Anket2.dat');
Reset(f1);
Rewrite(f11);
while not EOF(f1) do
begin
Read(f1, e);
Write(f11, e);
if e.Spec = Edit1.Text then
begin
ListBox1.Items.Add(e.FIO);
end;
end;
CloseFile(f1);
CloseFile(f11);
end;
Некоторые важные моменты:

Убедитесь, что файлы "Vacansii.dat" и "Anket.dat" существуют в правильном формате и месте.
Используйте правильные расширения для файлов с записями, например, ".dat".
Код Reset и Rewrite следует использовать для работы с файлами записей (record files), а не текстовыми файлами. В вашем случае это File of TPred и File of TPerson.
Также, для текстовых файлов, если вам нужно работать именно с ними, нужно использовать подходящие типы и процедуры. Пример для текстовых файлов:

 var  
tfVacansii: TextFile;
tfVacansii2: TextFile;
tfAnket: TextFile;
tfAnket2: TextFile;

procedure TForm4.Button1Click(Sender: TObject);
var
line: string;
begin
// Работа с вакансиями
AssignFile(tfVacansii, 'Vacansii.txt');
AssignFile(tfVacansii2, 'Vacansii2.txt');
Reset(tfVacansii);
Rewrite(tfVacansii2);
while not EOF(tfVacansii) do
begin
Readln(tfVacansii, g.Naz);
Readln(tfVacansii, g.Vac);
Writeln(tfVacansii2, g.Naz);
Writeln(tfVacansii2, g.Vac);
end;
CloseFile(tfVacansii);
CloseFile(tfVacansii2);

// Работа с анкетами
AssignFile(tfAnket, 'Anket.txt');
AssignFile(tfAnket2, 'Anket2.txt');
Reset(tfAnket);
Rewrite(tfAnket2);
while not EOF(tfAnket) do
begin
Readln(tfAnket, e.FIO);
Readln(tfAnket, e.Spec);
Writeln(tfAnket2, e.FIO);
Writeln(tfAnket2, e.Spec);
if e.Spec = Edit1.Text then
begin
ListBox1.Items.Add(e.FIO);
end;
end;
CloseFile(tfAnket);
CloseFile(tfAnket2);
end;
Похожие вопросы