Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 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 (но это все только для красоты) :)

Удачи!!!

Приложение:
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7. Dialogs, StdCtrls, Grids;
  8.  
  9. type
  10. TForm1 = class(TForm)
  11. Edit1: TEdit;
  12. Button1: TButton;
  13. Label1: TLabel;
  14. Button2: TButton;
  15. StringGrid1: TStringGrid;
  16. procedure Button1Click(Sender: TObject);
  17. procedure Button2Click(Sender: TObject);
  18. private
  19. { Private declarations }
  20. public
  21. { Public declarations }
  22. end;
  23.  
  24. type
  25. sotrudn = record
  26. surname:string[30];
  27. zarpl:real;
  28. end;
  29. var
  30. Form1: TForm1;
  31. datfl: file of sotrudn;
  32. dt_v:sotrudn;
  33.  
  34. implementation
  35.  
  36. {$R *.dfm}
  37.  
  38. procedure TForm1.Button1Click(Sender: TObject);
  39. var i:integer;
  40. begin
  41. AssignFile(datfl,'sotrudn.dat');
  42. Rewrite(datfl);
  43. for i:=1 to StrToInt(Edit1.Text) do
  44. begin
  45.  
  46.  
  47. write(datfl,dt_v);
  48. end;
  49. CloseFile(datfl);
  50. end;
  51.  
  52. procedure TForm1.Button2Click(Sender: TObject);
  53. var i:integer;
  54. begin
  55. AssignFile(datfl,'sotrudn.dat');
  56. Reset(datfl); i:=1;
  57. StringGrid1.RowCount:=FileSize(datfl)+1;
  58.  
  59.  
  60. while not eof(datfl) do
  61. begin
  62. read(datfl,dt_v);
  63. StringGrid1.Cells[0,i]:=Format('%d',[i]);
  64. StringGrid1.Cells[1,i]:=dt_v.surname;
  65. StringGrid1.Cells[2,i]:=Format('%.3f',[dt_v.zarpl]);
  66. inc(i);
  67. end;
  68. CloseFile(datfl);
  69. end;
  70.  
  71. end.
  72.  


Ответ отправил: Николай Рубан (статус: 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], а расширение в прямом смысле никакой роли не играет, а я думал, что вся фишка именно в нём. Если кому надо, обращайтесь - научу (шутка конечно).

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:33
Выполнено за 0.02 сек.