Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сохранение массивов в файлы, я опять запутался... 
:(
    Опции темы
6Apokali6sis6
  Дата 2.4.2006, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 21.12.2005

Репутация: нет
Всего: нет



Так. Пытаюсь сохранить три массива в 3 файла. Причём Сохранение происходит, затем файлы закрываеются, а затем еси пользователь хочет ввести ещё данные(прога-телефонная книга) то файлы снова откр, соххр, и закр. Вот фрагмент кода реализующий сохранение:
Код

procedure TNew.Button1Click(Sender: TObject);
var i:integer;
begin
For i:=1 to nomer do
begin
ima:=Edit1.Text;
familia:=Edit2.Text;
telefon:=StrToInt(Edit3.Text);
 Assignfile(t, 'd:\Name.txt');
 append(t);
 write(t,ima);
 closefile(t);
 {=========}
 Assignfile(t, 'd:\Surname.txt');
 append(t);
 write(t,familia);
 closefile(t);
 {=========}
 Assignfile(t, 'd:\Phone.txt');
 append(t);
 write(t,telefon);
 closefile(t);
end;

    Edit1.Text:='';
    Edit2.Text:='';
    Edit3.Text:='';

end;



В основной части проги написано:
Код

begin
assignfile(t,'d:\Name.txt');
rewrite(t);
closefile(t);
assignfile(t,'d:\Surname.txt');
rewrite(t);
closefile(t);
assignfile(t,'d:\Phone.txt');
rewrite(t);
closefile(t);
end.

В ходе самой программы в файлы судя по всему ничего не записывается, так как до завершения оной при поиске, ничего не происходит. Поиск реализован вот так:
Код

procedure TSearch.Button1Click(Sender: TObject);
var
h:longint;
i,nomer,c:integer;
s:word;
begin
begin
assignfile(t,'d:\Surname.txt');
reset(t);
for i:=1 to nomer do
read(t,a[i]);
closefile(t);
end;
vibor:=Edit1.Text;
  for nomer:= 0 to 100 do
   if a[nomer]=vibor then
   begin
      c:=nomer;
      Edit2.Text:=vibor;
   end;
assignfile(t,'d:\Name.txt');
reset(t);
for i:=1 to c do
read(t,a[i]);
closefile(t);
Edit3.Text:=a[c];
assignfile(t,'d:\Phone.txt');
reset(t);
for i:=1 to c do
read(t,a[i]);
closefile(t);
Edit4.Text:=a[c];

При компиляции ошибок в синтаксисе не находит но при работе программы при нажатии на кнопочку найти(описание выше) выдаёт вот это:
Failed with message:'access violation at 0x0040664d: write of adress 0x00030f2c'.Process stoped.

Прошу помощи. Заранее благодарен Ap{}k@lipsis.
PM MAIL   Вверх
Poseidon
Дата 2.4.2006, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Почему ты читаешь в a[i] {read(t,a[i]);строка 11}, т.е. по сути в a[0], т.к. i ничего не присвоено, а ищешь потом по a[nomer], строка 16 (т.е. по сути по a[0]...a[100])? И еще: как обьявлены a и t?

PS. Лучше выложи проект.
PPS Лучше, для этой задачи, используй базу данных smile


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
6Apokali6sis6
Дата 2.4.2006, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 21.12.2005

Репутация: нет
Всего: нет



a:array[1..100] of char;
t:TextFile;

посему слегка подкорректировал код:
Код

procedure TSearch.Button1Click(Sender: TObject);
var
h:longint;
i,c:integer;
s:word;
begin
begin
assignfile(t,'d:\Surname.txt');
reset(t);
for i:=1 to 100 do
read(t,a[i]);
closefile(t);
end;
vibor:=Edit1.Text;
  for i:= 0 to 100 do
   if a[i]=vibor then
   begin
      c:=i;
      Edit2.Text:=vibor;
   end;
assignfile(t,'d:\Name.txt');
reset(t);
for i:=1 to c do
read(t,a[i]);
closefile(t);
Edit3.Text:=a[c];
assignfile(t,'d:\Phone.txt');
reset(t);
for i:=1 to c do
read(t,a[i]);
closefile(t);
Edit4.Text:=a[c];


end;


но это не помогает, тпомоему проблема не в чтении из файла а в записи в него. Или я не прав.

З.Ы. Базы данных не использую для решения данной задачи принципиально. Меня интерисует именно такое решения и никак иначе. К тому-же так сложнее, а соответсвенно интересней.
PM MAIL   Вверх
Guedda
Дата 2.4.2006, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 14
Всего: 78



А какого типа у тебя файлы?


--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
Albinos_x
Дата 2.4.2006, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



Цитата(6Apokali6sis6 @ 2.4.2006, 13:10 Найти цитируемый пост)
при нажатии на кнопочку найти(описание выше) выдаёт вот это:
Failed with message:'access violation at 0x0040664d: write of adress 0x00030f2c'.Process stoped.

на какой строчке вылетает ошибка?


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
6Apokali6sis6
Дата 2.4.2006, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 21.12.2005

Репутация: нет
Всего: нет



Файлы вроде тип txt!



Как понять на какой строчке? Ошибка вылетает не ри компиляции а при работе проги в окошечке под названием CPU. В разделе LoadResString на строчке:
0040664D push $00000400
PM MAIL   Вверх
Albinos_x
Дата 2.4.2006, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



Цитата(6Apokali6sis6 @ 2.4.2006, 14:06 Найти цитируемый пост)
но это не помогает, тпомоему проблема не в чтении из файла а в записи в него. Или я не прав.


{вырезано, прошу прощения недосмотрел}

Цитата

assignfile(t,'d:\Name.txt');
reset(t);
for i:=1 to c do
read(t,a[i]);
closefile(t);
Edit3.Text:=a[c];
assignfile(t,'d:\Phone.txt');
reset(t);
for i:=1 to c do
read(t,a[i]);
closefile(t);
Edit4.Text:=a[c];

смысл этих операций вообще не понятен.... зачем в пустую их гоняешь?

Цитата(6Apokali6sis6 @ 2.4.2006, 14:18 Найти цитируемый пост)
Как понять на какой строчке? Ошибка вылетает не ри компиляции а при работе проги в окошечке под названием CPU. В разделе LoadResString на строчке:
0040664D push $00000400

пошаговая отладка или через точки останова... с их помощью всё вычисляется...


Это сообщение отредактировал(а) Albinos_x - 2.4.2006, 14:37


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Guedda
Дата 2.4.2006, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 14
Всего: 78



Цитата(Albinos_x @ 2.4.2006, 15:26 Найти цитируемый пост)
ясен фиг:
Цитата

reset(t);
for i:=1 to 100 do
read(t,a[i]);
closefile(t);
end;

зачем файл внутри тела цыкла закрываешь?

Гы. Там все нормально. Закрывается после цикла.


--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
Albinos_x
Дата 2.4.2006, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



Цитата(Guedda @ 2.4.2006, 14:36 Найти цитируемый пост)
Гы. Там все нормально. Закрывается после цикла.

уже удалил... недосмотрел begin smile
Добавлено @ 14:44
Цитата(Albinos_x @ 2.4.2006, 14:26 Найти цитируемый пост)
смысл этих операций вообще не понятен.... зачем в пустую их гоняешь?

имею ввиду, что переменная с у тебя нигде не инициализирована.... т.е. по умолчанию скорее всего равна нулю...


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Albinos_x
Дата 2.4.2006, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



Цитата

for i:=1 to 100 do
  read(t,a[i]);

уверен, что у тебя там в строке 100 символов?
проще и даже наверно целесообразней использовать:
Код

...
var a:string;
...
ReadLn(t,a);
// ненужное отрезать
if length(a)>100 then delete(a, 101, length(a)-100);

в результате выполняется не 201 операция, а 2-4...
кроме того избегаем ошибки если строка меньше 100 символов....


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
former
Дата 2.4.2006, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: 5
Всего: 17



Не понимаю, зачем париться с тремя массивами???? smile Используй записи и сохраняй в один файл.

а лучше:

Цитата

Poseidon, PPS Лучше, для этой задачи, используй базу данных



--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
Albinos_x
Дата 2.4.2006, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



Цитата

for i:= 0 to 100 do
  if a[i]=vibor then
  begin
      c:=i;
      Edit2.Text:=vibor;
  end;

условие внутри цикла всегда будет false, т.к. сравниваешь стоку с символом...
Цитата

for i:=1 to c do
read(t,a[i]);
closefile(t);
Edit4.Text:=a[c];

переменная С последний является индексом последнего элемента (предпологаю, т.к. они не инициализирована и равна 0), зачем тебе в Edit4.Text последний симол массива? к тому же если С:=0 то ты обращаешся к несуществующему элементу массива... оттуда и ошибка...


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
6Apokali6sis6
Дата 2.4.2006, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 21.12.2005

Репутация: нет
Всего: нет



Код

for i:= 0 to 100 do 
  if a[i]=vibor then 
  begin 
      c:=i; 
      Edit2.Text:=vibor; 
  end;


хм...всегда фолс? а как тогда срвнить значение стоящее в a[i]? Ведь там не один символ, а слово. Вот нужно енто слово сравнить с тем, что находится в Эдит1Текст.



З.Ы Я бы сделал из записей, но там с сохранением у меня ещё туже чем здесь(хотя куда уж туже smile )
PM MAIL   Вверх
Poseidon
Дата 2.4.2006, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Цитата(6Apokali6sis6 @ 2.4.2006, 14:37 Найти цитируемый пост)
а как тогда срвнить значение стоящее в a[i]? Ведь там не один символ, а слово.
Так как раз токи там один символ!

Цитата(6Apokali6sis6 @ 2.4.2006, 13:06 Найти цитируемый пост)
a:array[1..100] of char;





--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
former
Дата 2.4.2006, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: 5
Всего: 17



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

Код

type
  TMyRec = record ;
    Field1: integer;
    Field2: string;
  end;

  TMyRecArray = array[0..9] of TMyRec;

var
  MyArray: TMyRecArray; //динамический массив
  MyRec: TMyRec;
  RecFile: file of TMyRec;

begin
  {...здесь должен быть расположен код инициализации MyArray...}

  AssignFile(RecFile, 'MYREC.FIL');
  ReWrite(RecFile);
  for i := 0 to 9 do
  begin
    Write(RecFile, MyRec[i]);
  end;
  CloseFile(RecFile);
end;


Чтение аналогично.
Количество записей можно хранить в файле настройки, например.
Всё же проще, чем с текстовыми файлами (к тому же с тремя) и его никто, кроме твоей проги, не прочитает.

Будут вопросы, пиши.




--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0627 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.