|
Вопрос # 280/ вопрос открыт / |
|
Здравствуйте!
По условию, существует некий файл *.dat, в котором записаны фамилии работников(string) и их зарплаты(real).
Создана структура данных типа "Запись" для обработки требуемых сведений:
Type sotrudn = record
surname:str;
zarpl:real;
end;
Из этого файла нужно считать данные(фамилии работников и их зарплаты) и вывести их в компонент StringGrid1.
Проблема в том, что я не знаю как работать с файлами *.dat, не умею ни записывать их, ни считывать.
Знаю что файл нужно определять по структуре записи, в смысле ff:file of sotrudn;
Кстати, в ходе задачи создавался динамический массив для сохранения сведений о сотрудниках(Type massiv=array of sotrudn;)
Заранее благодарю, с уважением Сергей Анатольевич;
 |
Вопрос задал: Полушин Сергей Анатольевич (статус: Посетитель)
Вопрос отправлен: 23 января 2007, 17:19
Состояние вопроса: открыт, ответов: 3.
|
Ответ #1. Отвечает эксперт: Виталий Лещенко
Здравствуйте, Полушин Сергей Анатольевич!
1. Не смотря на расширение файла его можно использовать как обычный текстовый файл.
2. Первой строкой пишеш туда (writeln(file,...)) кол-во сотрудников.
3. Затем для каждого сотрудника в новой строке пишеш данные о нем... хочеш в одну строку, хочешь в несколько.
Считывание происходит в аналогичном порядке.
1. Считываешь кол-во записей. Делаешь массив на столько записей.
2. В соответствии и выбранным форматом, для каждого сотрудника читаешь данные.
 |
Ответ отправил: Виталий Лещенко (статус: 4-ый класс)
Время отправки: 23 января 2007, 19:15
Оценка за ответ: 4
Комментарий к оценке: По моему, просто записать кол-во сотрудников не получится, так как файл определяется по типу дданных. var ff:file of sotrudn;
|
Ответ #2. Отвечает эксперт: Николай Рубан
Начнем с того, почему Вы прицепились к расширению *.dat - вообще не важно какое расширение у типизированного файла, самое главное знать его структуру. Только тогда возможно полноценно с ним работать.
В приложении полный текст программы которая позволяет создавать и выводить типизированный файл указанного типа.
Для полноценной работы на форму проекта необходимо разместить две кнопки (TButton), одно поле ввода(TEdit) - в которое вводиться КОЛИЧЕСТВО записей которые нужно ВВЕСТИ. А также таблица (TStringGrid) - с такими настройками:
ColCount = 3
RowCount = 2
FixedCols = 1
FixedRows = 1 (но это все только для красоты) :)
Удачи!!!
Приложение: Переключить в обычный режим- unit Unit1;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, StdCtrls, Grids;
-
- type
- TForm1 = class(TForm)
- Edit1: TEdit;
- Button1: TButton;
- Label1: TLabel;
- Button2: TButton;
- StringGrid1: TStringGrid;
- procedure Button1Click(Sender: TObject);
- procedure Button2Click(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
-
- type
- sotrudn = record
- surname:string[30];
- zarpl:real;
- end;
- var
- Form1: TForm1;
- datfl: file of sotrudn;
- dt_v:sotrudn;
-
- implementation
-
- {$R *.dfm}
-
- procedure TForm1.Button1Click(Sender: TObject);
- var i:integer;
- begin
- AssignFile(datfl,'sotrudn.dat');
- Rewrite(datfl);
- for i:=1 to StrToInt(Edit1.Text) do
- begin
-
-
- write(datfl,dt_v);
- end;
- CloseFile(datfl);
- end;
-
- procedure TForm1.Button2Click(Sender: TObject);
- var i:integer;
- begin
- AssignFile(datfl,'sotrudn.dat');
- Reset(datfl); i:=1;
- StringGrid1.RowCount:=FileSize(datfl)+1;
-
-
- while not eof(datfl) do
- begin
- read(datfl,dt_v);
- StringGrid1.Cells[0,i]:=Format('%d',[i]);
- StringGrid1.Cells[1,i]:=dt_v.surname;
- StringGrid1.Cells[2,i]:=Format('%.3f',[dt_v.zarpl]);
- inc(i);
- end;
- CloseFile(datfl);
- end;
-
- end.
-
 |
Ответ отправил: Николай Рубан (статус: 10-ый класс)
Время отправки: 23 января 2007, 20:58
Оценка за ответ: 5
Комментарий к оценке: Большое Человеческое спасибо, вы единственный, от кого я получил то, что надо.
|
Ответ #3. Отвечает эксперт: Иусов Сергей Ник.
Здравствуйте, Полушин Сергей Анатольевич!
Смотри во вложении пример работы с типизарованными файлами.
 |
Ответ отправил: Иусов Сергей Ник. (статус: 3-ий класс)
Время отправки: 24 января 2007, 07:03
Оценка за ответ: 4
|
Мини-форум вопроса
Всего сообщений: 5; последнее сообщение — 28 января 2007, 19:59; участников в обсуждении: 4.
|
Виталий Лещенко (статус: 4-ый класс), 23 января 2007, 20:17 [#1]:
2 способ, действительно использовать записи
но:
1. Открывать для чтения/записи нужно так
rewrite(ffile, 1);
2. строки должны быть короткими... иначе будет писаться не строка а ее адрес в памяти.
|
|
Иусов Сергей Ник. (статус: 3-ий класс), 24 января 2007, 07:05 [#2]:
Блин, тут не много не так со вложениями.
Вот ссылка (файл удалён)
|
|
Виталик (статус: Посетитель), 25 января 2007, 20:44 [#3]:
По-моему, лучше пользоватся потоками (TFileStream).
|
|
Виталий Лещенко (статус: 4-ый класс), 26 января 2007, 10:17 [#4]:
>По-моему, лучше пользоватся потоками
Поддерживаю... но решать автору.
|
|
Полушин Сергей Анатольевич (статус: Посетитель), 28 января 2007, 19:59 [#5]:
Всё сделал, оказалось проще, чем я думал, записал mas[i], считал mas[i], а расширение в прямом смысле никакой роли не играет, а я думал, что вся фишка именно в нём. Если кому надо, обращайтесь - научу (шутка конечно).
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|