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

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

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

Delphi.int.ru Expert

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

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

#   

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


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

Подробнее »



Вопрос # 2 891

/ вопрос открыт /

Приветствую, уважаемые эксперты!
У меня проблема с программой, бьюсь целый день, ничего не выходит. С текстового файла считываю запись и пытаюсь работать с ней. Запись не считывается. можете ли указать на ошибку?

Приложение:
  1. Type Tmodels=record
  2. model:string[18];
  3. tona:real;
  4. visota:integer;
  5. radius:integer;
  6. speed:real;
  7. end;
  8. var
  9. Form1: TForm1;
  10. f: file of Tmodels;
  11. implementation
  12.  
  13. uses U_rez;
  14.  
  15. {$R *.dfm}
  16.  
  17. procedure TForm1.Button1Click(Sender: TObject);
  18. var marka:Tmodels;
  19. t,s:real;
  20. i,v,r:integer;
  21.  
  22. begin
  23. assignfile(f,'modeli.txt');
  24. reset(f);
  25. t:=strtofloat(ComboBox1.Text);
  26. v:=strtoint(ComboBox2.text);
  27. s:=strtofloat(ComboBox3.text);
  28. r:=strtoint(ComboBox4.text);
  29. rezult.memo1.lines.clear;
  30. rezult.memo1.lines.add('Ïî çàïðîñó íàéäåíî:');
  31. while not eof(f) do
  32. begin
  33. read(f,marka);
  34. with marka do begin
  35. {tona:=1;}
  36. if (t=tona){ or(v=visota) or (r=radius) or (s=speed)} then
  37. begin
  38. rezult.memo1.lines.add(model+'--'+floattostr(tona)+'--'
  39. +inttostr(visota)+'--'+inttostr(radius)+'--'+floattostr(speed));
  40. end else rezult.memo1.lines.add('no');
  41.  
  42. end;
  43. end;
  44. rezult.Memo1.Font.Color:=clred;
  45. rezult.Memo1.Font.Size:=12;
  46. rezult.ShowModal;
  47. closefile(f);
  48. end;
  49.  


Polly Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задала: Polly (статус: Посетитель)
Вопрос отправлен: 8 июня 2009, 20:17
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: min@y™

Свой предыдущий ответ я аннулирую.
Внимание! Правильный ответ!
См. приложение.

Приложение:
  1. program p2891;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses SysUtils;
  6.  
  7. Type
  8. TModels = record
  9. model: shortstring;
  10. tona: real;
  11. visota: integer;
  12. radius: integer;
  13. speed: real;
  14. end;
  15.  
  16. function GetNextWord(const S: string; var Index: Integer): string;
  17. begin
  18. Result:= '';
  19.  
  20. while Index <= Length(S) do
  21. begin
  22. if S[Index] <> ' '
  23. then Result:= Result + S[Index]
  24. else Break;
  25.  
  26. Inc(Index);
  27. end;
  28.  
  29. Inc(Index);
  30. end;
  31.  
  32. function ReadFile(const FileName: string): Boolean;
  33. var
  34. F: TextFile;
  35. Rec: TModels;
  36. S: string;
  37. Index, Line: Integer;
  38. begin
  39. AssignFile(F, FileName);
  40. Line:= 1;
  41.  
  42. {$i-}
  43. Reset(F);
  44. with Rec do
  45. while not eof(F) do
  46. begin
  47. Index:= 1;
  48. ReadLn(F, S);
  49.  
  50. model:= GetNextWord(S, Index);
  51. try
  52. tona:= StrToFloat(GetNextWord(S, Index));
  53. visota:= StrToInt(GetNextWord(S, Index));
  54. radius:= StrToInt(GetNextWord(S, Index));
  55. speed:= StrToFloat(GetNextWord(S, Index));
  56. except
  57. WriteLn(#13#10' IO error in line ', Line);
  58. Break;
  59. end;
  60.  
  61. WriteLn('model = ', model, #13#10,
  62. ' tona = '#9, tona: 4:2, #13#10,
  63. ' visota = '#9, visota, #13#10,
  64. ' radius = '#9, radius, #13#10,
  65. ' speed = '#9, speed:4:2);
  66. Inc(Line);
  67. end;
  68.  
  69. CloseFile(F);
  70. {$i+}
  71.  
  72. Result:= IOResult() = 0;
  73. end;
  74.  
  75. begin
  76.  
  77.  
  78. if not ReadFile('modeli.txt')
  79. then WriteLn(' IO error!');
  80.  
  81. WriteLn(#13#10' Press "Enter" to exit...');
  82. ReadLn;
  83. end.
  84.  


Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 8 июня 2009, 20:53
Оценка за ответ: 5

Комментарий к оценке: Спасибо!!!

Мини-форум вопроса

Всего сообщений: 15; последнее сообщение — 8 июня 2009, 22:01; участников в обсуждении: 4.
min@y™

min@y™ (статус: Доктор наук), 8 июня 2009, 20:30 [#1]:

Покажи файл modeli.txt.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Вадим К

Вадим К (статус: Академик), 8 июня 2009, 20:31 [#2]:

Так текстовый или типизированный? так как судя по коду - читается типизированный файл.
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 8 июня 2009, 20:38 [#3]:

Цитата (Вадим К):

Так текстовый или типизированный?

Вот и я про то же.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Polly

Polly (статус: Посетитель), 8 июня 2009, 20:39 [#4]:

файл modeli.txt
BalancarEB687 1 4500 1600 20
BalancarEB797 3.5 4500 2050 14
KomatsuAX50 1.75 3000 1915 19
KomatsuAE30 1 6000 1775 14.5
KomatsuAM30 1 6000 1325 12
KomatsuAM2R 1.5 3330 1469 14
TBEKCVP0500 5 3300 3200 20
TBEKCVP16 1.6 3000 1900 20
HeliCPCD10 1 3000 1880 18
HeliCPCD250 9 4000 6100 29
MitsubishiFB10KRT 1 3300 1700 16
MitsubishiFD135 13.5 4000 5750 16
NissanVPFG15 1.5 3000 1950 16
NissanVPFG35 3.5 3000 2615 18
TCMFD35 4 4500 2730 19.5
Вадим К

Вадим К (статус: Академик), 8 июня 2009, 20:39 [#5]:

можно с текстового файла читать как с типизированого. Правда надо всё подогнать правильно:)
Галочка "подтверждения прочтения" - вселенское зло.
Вадим К

Вадим К (статус: Академик), 8 июня 2009, 20:42 [#6]:

вот так. файл текстовый. Так и читайте с него как с текстового.
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 8 июня 2009, 20:48 [#7]:

Ну, я так и думал.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Polly

Polly (статус: Посетитель), 8 июня 2009, 20:55 [#8]:

мне бы поподробнее, что-то я ваши мысли не разумею.
мне бы с типизированного файла прочесть запись, сравнить данные и при совпадении вывести в мемо
Polly

Polly (статус: Посетитель), 8 июня 2009, 21:10 [#9]:

invalid numeric input -эта ошибка после рекомендованого измненения программы
Вадим К

Вадим К (статус: Академик), 8 июня 2009, 21:36 [#10]:

А может для начала записать типизированный файл? "что бы что то прочитать, надо что то записать". Так как у Вас нет типизированного файла, то как можно читать.
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 8 июня 2009, 21:42 [#11]:

Написал пример, проверил.
При считывании из текстового файла, если указать в функции Read или ReadLn параметр типа string, string[xx], shortstring, то в него считывается вся строка до конца. В остальные параметры попадает мусор.

Итог: надо читать построчно, а результаты парсить и распихивать по полям записи вручную.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Polly

Polly (статус: Посетитель), 8 июня 2009, 21:43 [#12]:

разве я не могу создать в блокноте файлик с данными и объявить его в программе типизированным?

и почему у меня опять ошибка чтения файла, когда я его объявляю текстовым и читаю его как рекомендовано выше?
Polly

Polly (статус: Посетитель), 8 июня 2009, 21:49 [#13]:

Итог: надо читать построчно, а результаты парсить и распихивать по полям записи вручную.

что такое парсить и как распихать вручную?????????
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 8 июня 2009, 21:54 [#14]:

в блокноте можно создать файл только одного типа - текстовый.
Чтобы читать файл как Вам хочется - в определенную Вами запись - надо сначала записать его так же. Т.е. поместить информацию в запись, а затем писать ее в файл, объявленного типа. Об этом уже говорили выше.
Ошибка и будет возникать - наверняка это ошибка - несовпадение типов. Файл текстовый, а читать пытаетесь значения типов integer, real. Кроме того, процедура Read не производит перевод строки в текстовом файле. Получится бесконечный цикл. Если хотите прочитать сразу всю строку, то надо использовать readln(f,читаемые переменные). Либо read(f,читаемые переменные), затем readln(f);
min@y™

min@y™ (статус: Доктор наук), 8 июня 2009, 22:01 [#15]:

Цитата:

что такое парсить и как распихать вручную?????????

Парсить строку - это разобрать её на нужные составляющие. Щас изменю свой ответ, посмотришь.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

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

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