Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
13 / 13 / 6
Регистрация: 02.07.2011
Сообщений: 62
1

Запись в файл и считывание

02.07.2011, 21:19. Показов 1219. Ответов 17
Метки нет (Все метки)

Доброго времени суток!!
У мене возник такой вопрос:
у меня есть тип :
Delphi
1
2
3
4
5
6
7
8
9
inf= record
                            firm:string[50];
                            shyfr:integer;
                            tovarim:string[60];
                            post_tov:string[50];
                            data:string[15];
                            vart_tov:integer;
                            n_tov:integer;
                             end;
дальше файл данного типа и массив данного типа
Delphi
1
2
3
4
5
6
implementation
 
{$R *.dfm}
var new:array [1..100] of inf;
    k:integer;
    f:file of inf;
дальше процедура записи даных у масив
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
procedure TForm2.btn1Click(Sender: TObject);
begin
  if (edt1.Text='')  or (edt2.Text='') or (edt3.Text='') or
     (edt4.Text='') or (edt5.Text='') or (edt6.Text='') or
      (edt7.Text='') then ShowMessage('Ââåä³òü äàíí³');
k:=k+1;
new[k].firm:=edt1.Text;
new[k].shyfr:=strtoint(edt2.Text);
new[k].tovarim:=edt3.text;
new[k].post_tov:=edt4.Text;
new[k].vart_tov:=strtoint(edt5.Text);
new[k].n_tov:=strtoint(edt6.Text);
new[k].data:=edt7.Text;
edt1.Text:='';
edt2.Text:='';
edt3.Text:='';
edt4.Text:='';
edt5.Text:='';
edt6.Text:='';
edt7.Text:='';
btn2.Enabled:=True;
end;
и процедура записи у файл
Delphi
1
2
3
4
5
6
7
8
9
if Save.Execute then
   begin
   AssignFile(f,Save.FileName);
   rewrite(f);
   for i:=1 to k do
   Seek(f,FileSize(f));
   write(f,new[i]);
   CloseFile(f);
   end;
как мне обратно из этого файла считать данные и поочередно вывести в Edit'ы?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.07.2011, 21:19
Ответы с готовыми решениями:

Считывание и запись в файл
Прошу помочь с одной програмкой. Мне надо сделать прогу которая считывает текст из файла (*.txt) и...

Запись в файл и считывание с файла
Суть задания: имеется строка (s), алгоритм формирования которой уже есть и отлично работает,...

Считывание и запись в файл
Здравствуйте! Опишите как считать информацию а потом записать ее в файл на примере: Тоесть...

Считывание и запись в файл
Короче пытаюсь считать из одного файла цифру и записать ее в другой файл На то что после // не...

17
Модератор
63391 / 47080 / 32450
Регистрация: 18.05.2008
Сообщений: 114,121
02.07.2011, 21:42 2
Примерно так.
Delphi
1
2
3
4
5
6
7
8
9
10
var z:inf;
.......
reset(f);
while not eof(f) do
 begin
  read(f,z);
  edt1.Text:=w[k].firm;
  edit2.Text:inttostr(z.shyfr);
 .........
 end;
только выводить нужно не в Эдиты, а например в StringGrid, или Эдитов делать море.
0
13 / 13 / 6
Регистрация: 02.07.2011
Сообщений: 62
02.07.2011, 22:00  [ТС] 3
а если считывать в массив этого типа и потом поочередно выводить их?
0
Модератор
63391 / 47080 / 32450
Регистрация: 18.05.2008
Сообщений: 114,121
02.07.2011, 22:01 4
Я вообще не понимаю для чего этот ананизм с массивом...
1
13 / 13 / 6
Регистрация: 02.07.2011
Сообщений: 62
02.07.2011, 22:30  [ТС] 5
я бы написал полное задание но оно слишком большое...
короче если я считаю с файла в массив то мне будет нужно вывести в такую форму как на изображинию
и там ходить по массиву
понимаешь?
0
Миниатюры
Запись в файл и считывание  
Модератор
63391 / 47080 / 32450
Регистрация: 18.05.2008
Сообщений: 114,121
02.07.2011, 22:35 6
Ну так и выведи в StringGrid. Только непонятно для чего нужен массив.

Добавлено через 3 минуты
Вот какой смысл писать сначала в массив, потом в файл, потом обратно из файла в массив?
Или работай с массивом, или пиши сразу в файл. Типизированный файл сам по сути массив.
0
13 / 13 / 6
Регистрация: 02.07.2011
Сообщений: 62
02.07.2011, 22:45  [ТС] 7
массив этого типа:
Delphi
1
2
3
4
5
6
7
8
9
                 inf= record
                            firm:string[50];
                            shyfr:integer;
                            tovarim:string[60];
                            post_tov:string[50];
                            data:string[15];
                            vart_tov:integer;
                            n_tov:integer;
                             end;
там есть имя фирмы, шифр товара,имя товара, имя поставщика, количество товара , цена товара и дата поставки, пользователь это считывает с файла и потом смотрит,
каждый елемент массива имеет эти 7 значений

Добавлено через 8 минут
Цитата Сообщение от Puporev Посмотреть сообщение
Ну так и выведи в StringGrid. Только непонятно для чего нужен массив.

Добавлено через 3 минуты
Вот какой смысл писать сначала в массив, потом в файл, потом обратно из файла в массив?
Или работай с массивом, или пиши сразу в файл. Типизированный файл сам по сути массив.
ну так надо за условием....(((
0
712 / 400 / 33
Регистрация: 04.10.2009
Сообщений: 1,686
02.07.2011, 22:52 8
Уберите процесс чтения/записи в массив. А мотивировать для преподавателя можете так "100 элементов типизированного файла в массиве займут очень много оперативной памяти, что, на маломощных компьютерах, может быть фатальным. Так же никогда нельзя точно сказать - сколько строк будет храниться в файле. А вдруг понадобится 101 строка? Оптимизировав алгоритм я отказался от использования массива".
Все. Преподаватель "ваш на веки"
0
13067 / 5853 / 1705
Регистрация: 19.09.2009
Сообщений: 8,807
02.07.2011, 22:53 9
kalpakk, тебе правильно Puporev подсказывает - применение TStringGrid даст пользователю бОльшие удобства. - Он будет видеть список и сможет перемещаться по строкам (записям) привычным способом. При этом будет видно сразу несколько записей.
---
Если надо в массив данные прочитать, то здесь надо динамический массив использовать. Т. к., количество элементов в файле может меняться.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var
  Arr : array of inf;
  i, Size : Integer;
...
begin
...
  Size := FileSize(F);
  SetLength(Arr, Size);
  Reset(F);
  i := 0;
  while not Eof(F) do begin
    Read(F, Arr[i]);
    Inc(i);
  end;
...
0
712 / 400 / 33
Регистрация: 04.10.2009
Сообщений: 1,686
02.07.2011, 22:54 10
Вообще процесс работы с типизированным файлом выглядит так:
Читаем строку - выводим на экран.
А уж как вы на строку попали и на какую именно - это дело поставленной задачи и алгоритма.
0
13067 / 5853 / 1705
Регистрация: 19.09.2009
Сообщений: 8,807
02.07.2011, 22:55 11
Цитата Сообщение от kalpakk Посмотреть сообщение
Delphi
1
var new:array [1..100] of inf;
В Delphi и в Pascal есть стандартная функция New(), предназначенная для выделения динамической памяти для различных объектов. Поэтому не надо объявлять одноимённые с этой функцией идентификаторы.
---
Цитата Сообщение от kalpakk Посмотреть сообщение
Delphi
1
for i:=1 to k do Seek(f,FileSize(f));
Здесь не нужен цикл. Один раз выполненная команда Seek(f,FileSize(f)); переместит файловый указатель в конец файла.
1
13 / 13 / 6
Регистрация: 02.07.2011
Сообщений: 62
02.07.2011, 23:06  [ТС] 12
Цитата Сообщение от Mawrat Посмотреть сообщение
Здесь не нужен цикл. Один раз выполненная команда Seek(f,FileSize(f)); переместит файловый указатель в конец файла.
Delphi
1
2
3
4
5
6
7
new[k].firm
new[k].shyfr
new[k].tovarim
new[k].post_tov
new[k].vart_tov
new[k].n_tov
new[k].data
я дописываю в конец файла этот масив

Добавлено через 2 минуты
Цитата Сообщение от Андрей Борисови Посмотреть сообщение
Уберите процесс чтения/записи в массив. А мотивировать для преподавателя можете так "100 элементов типизированного файла в массиве займут очень много оперативной памяти, что, на маломощных компьютерах, может быть фатальным. Так же никогда нельзя точно сказать - сколько строк будет храниться в файле. А вдруг понадобится 101 строка? Оптимизировав алгоритм я отказался от использования массива".
Все. Преподаватель "ваш на веки"
массив не займет больше
0
13067 / 5853 / 1705
Регистрация: 19.09.2009
Сообщений: 8,807
02.07.2011, 23:39 13
Цитата Сообщение от kalpakk Посмотреть сообщение
я дописываю в конец файла этот масив
Вот этот код делает следующее:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
if Save.Execute then
  begin
  AssignFile(f,Save.FileName);
  rewrite(f);
  //Здесь К раз выполняется функция перевода файлового указателя в конец файла.
  //это надо делать один раз. Больше одного раза подряд это делать бессмысленно.
  //Более того - здесь вызов Seek() вообще не нужен.
  for i:=1 to k do
  Seek(f,FileSize(f));
  //Здесь в файл записывается элемент с индексом (K+1).
  //Скорее всего здесь предполагалось другое поведение.
  write(f,new[i]);
  //Теперь файл закрывается.
  CloseFile(f);
  end;
Чтобы записать в файл К элементов надо делать так:
Delphi
1
2
3
4
5
if not Save.Execute then Exit;
AssignFile(f,Save.FileName);
rewrite(f);
for i:=1 to k do write(f, new[i]);
CloseFile(f);
1
13 / 13 / 6
Регистрация: 02.07.2011
Сообщений: 62
02.07.2011, 23:53  [ТС] 14
Mawrat, спасибо)
а как потом считать их обратно в это массив)
0
13067 / 5853 / 1705
Регистрация: 19.09.2009
Сообщений: 8,807
02.07.2011, 23:59 15
Цитата Сообщение от kalpakk Посмотреть сообщение
а как потом считать их обратно в это массив)
Я в одном из предыдущих постов об этом писал уже.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var
  F : file of inf;
  Arr : array of inf;
  i, Size : Integer;
  FileName : String;
...
begin
...
  AssignFile(F, FileName);
  Reset(F);
  Size := FileSize(F);
  SetLength(Arr, Size);
  i := 0;
  while not Eof(F) do begin
    Read(F, Arr[i]);
    Inc(i);
  end;
...
1
13 / 13 / 6
Регистрация: 02.07.2011
Сообщений: 62
03.07.2011, 00:05  [ТС] 16
Mawrat, спасибо огромное)))
а функция inc(i) делает это : i:=i+1 ?
0
13067 / 5853 / 1705
Регистрация: 19.09.2009
Сообщений: 8,807
03.07.2011, 00:16 17
Цитата Сообщение от kalpakk Посмотреть сообщение
а функция inc(i) делает это : i:=i+1 ?
Да - верно. Ещё, можно использовать дополнительный параметр:
Inc(i, m); -> i := i + m;
Dec(i, m); -> i := i - m;
2
13 / 13 / 6
Регистрация: 02.07.2011
Сообщений: 62
03.07.2011, 00:19  [ТС] 18
спасибо)))
сохраню в мозгу хДД)))
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.07.2011, 00:19

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Считывание и запись в файл
решил задачу на с, го её нужно перевести на с++. у меня возникли проблемы с считыванием и записью в...

Считывание и запись в файл
Мне подсказали здесь на форуме как красиво считать из файла в переменную FilenameST = "C:\12.html"...

считывание и запись в файл
вот написал программу на C++ builder в консоли, считывающую два числа и записывающую в файл их...

считывание и запись в файл
здравствуйте! есть прожка на с++ билдер, расчетная, которая выдает одно значение, и есть файл rtf,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.