| 
| 
 | Вопрос # 2 891/ вопрос открыт / | 
 |  Приветствую, уважаемые эксперты!У меня проблема с программой, бьюсь целый день, ничего не выходит. С текстового файла считываю запись и пытаюсь работать с ней. Запись не считывается. можете ли указать на ошибку?
 Приложение:Переключить в обычный режим Type Tmodels=record  model:string[18];  tona:real;  visota:integer;  radius:integer;  speed:real;  end;var  Form1: TForm1;   f: file of Tmodels;implementation uses U_rez; {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var    marka:Tmodels;        t,s:real;        i,v,r:integer; beginassignfile(f,'modeli.txt');reset(f);t:=strtofloat(ComboBox1.Text);v:=strtoint(ComboBox2.text);s:=strtofloat(ComboBox3.text);r:=strtoint(ComboBox4.text); rezult.memo1.lines.clear; rezult.memo1.lines.add('Ïî
çàïðîñó
íàéäåíî:');while not eof(f) do begin read(f,marka);with marka do begin{tona:=1;}if (t=tona){ or(v=visota) or (r=radius) or (s=speed)} thenbeginrezult.memo1.lines.add(model+'--'+floattostr(tona)+'--'+inttostr(visota)+'--'+inttostr(radius)+'--'+floattostr(speed));  end else rezult.memo1.lines.add('no');   end;end;  rezult.Memo1.Font.Color:=clred; rezult.Memo1.Font.Size:=12; rezult.ShowModal;  closefile(f);end; 
|  |   Вопрос задала: Polly (статус: Посетитель)Вопрос отправлен: 8 июня 2009, 20:17
 Состояние вопроса: открыт, ответов: 1.
 |  Ответ #1. Отвечает эксперт: min@y™ Свой предыдущий ответ я аннулирую. Внимание! Правильный ответ!
 См. приложение.
 Приложение:Переключить в обычный режим program p2891; {$APPTYPE CONSOLE} uses SysUtils; Type  TModels = record    model:  shortstring;    tona:   real;    visota: integer;    radius: integer;    speed:  real;  end; function GetNextWord(const S: string; var Index: Integer): string;begin  Result:= '';   while Index <= Length(S) do    begin      if S[Index] <> ' '        then Result:= Result + S[Index]        else Break;       Inc(Index);    end;   Inc(Index);end; function ReadFile(const FileName: string): Boolean;var  F: TextFile;  Rec: TModels;  S: string;  Index, Line: Integer;begin  AssignFile(F, FileName);  Line:= 1;   {$i-}  Reset(F);  with Rec do    while not eof(F) do      begin        Index:= 1;        ReadLn(F, S);         model:= GetNextWord(S, Index);        try          tona:=   StrToFloat(GetNextWord(S, Index));          visota:= StrToInt(GetNextWord(S, Index));          radius:= StrToInt(GetNextWord(S, Index));          speed:=   StrToFloat(GetNextWord(S, Index));        except          WriteLn(#13#10' IO error in line ', Line);          Break;        end;         WriteLn('model = ',      model, #13#10,                '  tona = '#9,   tona: 4:2, #13#10,                '  visota = '#9, visota, #13#10,                '  radius = '#9, radius, #13#10,                '  speed = '#9,  speed:4:2);        Inc(Line);      end;   CloseFile(F);  {$i+}   Result:= IOResult() = 0;end; begin    if not ReadFile('modeli.txt')    then WriteLn('  IO error!');   WriteLn(#13#10'  Press "Enter" to exit...');  ReadLn;end. 
|  | Ответ отправил: min@y™ (статус: Доктор наук)Время отправки: 8 июня 2009, 20:53
 Оценка за ответ: 5
 Комментарий к оценке: Спасибо!!! |  
 Мини-форум вопросаВсего сообщений: 15; последнее сообщение — 8 июня 2009, 22:01; участников в обсуждении: 4. 
|   | min@y™ (статус: Доктор наук), 8 июня 2009, 20:30 [#1]:Покажи файл modeli.txt. Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Вадим К (статус: Академик), 8 июня 2009, 20:31 [#2]:Так текстовый или типизированный? так как судя по коду - читается типизированный файл. Галочка "подтверждения прочтения" - вселенское зло. |  
|   | min@y™ (статус: Доктор наук), 8 июня 2009, 20:38 [#3]: Цитата (Вадим К): Так текстовый или типизированный? Вот и я про то же.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | 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™ (статус: Доктор наук), 8 июня 2009, 20:48 [#7]:Ну, я так и думал. Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Polly (статус: Посетитель), 8 июня 2009, 20:55 [#8]:мне бы поподробнее, что-то я ваши мысли не разумею. мне бы с типизированного файла прочесть запись, сравнить данные  и при совпадении вывести в мемо
 |  
|   | Polly (статус: Посетитель), 8 июня 2009, 21:10 [#9]:invalid numeric input -эта ошибка после рекомендованого измненения программы |  
|   | Вадим К (статус: Академик), 8 июня 2009, 21:36 [#10]:А может для начала записать типизированный файл? "что бы что то прочитать, надо что то записать". Так как у Вас нет типизированного файла, то как можно читать. Галочка "подтверждения прочтения" - вселенское зло. |  
|   | min@y™ (статус: Доктор наук), 8 июня 2009, 21:42 [#11]:Написал пример, проверил. При считывании из текстового файла, если указать в функции Read или ReadLn параметр типа string, string[xx], shortstring, то в него считывается вся строка до конца. В остальные параметры попадает мусор.
 
 Итог: надо читать построчно, а результаты парсить и распихивать по полям записи вручную.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Polly (статус: Посетитель), 8 июня 2009, 21:43 [#12]:разве я не могу создать в блокноте файлик с данными и объявить его в программе типизированным? 
 и почему у меня опять ошибка чтения файла, когда я его объявляю текстовым и читаю его как рекомендовано выше?
 |  
|   | Polly (статус: Посетитель), 8 июня 2009, 21:49 [#13]:Итог: надо читать построчно, а результаты парсить и распихивать по полям записи вручную. 
 что такое парсить и как распихать вручную?????????
 |  
|   | Мережников Андрей (статус: Абитуриент), 8 июня 2009, 21:54 [#14]:в блокноте можно создать файл только одного типа - текстовый. Чтобы читать файл как Вам хочется - в определенную Вами запись - надо сначала записать его так же. Т.е. поместить информацию в запись, а затем писать ее в файл, объявленного типа. Об этом уже говорили выше.
 Ошибка и будет возникать - наверняка это ошибка - несовпадение типов. Файл текстовый, а читать пытаетесь значения типов integer, real. Кроме того, процедура Read не производит перевод строки в текстовом файле. Получится бесконечный цикл. Если хотите прочитать сразу всю строку, то надо использовать readln(f,читаемые переменные). Либо read(f,читаемые переменные), затем readln(f);
 |  
|   | min@y™ (статус: Доктор наук), 8 июня 2009, 22:01 [#15]: Цитата: что такое парсить и как распихать вручную?????????  Парсить строку - это разобрать её на нужные составляющие. Щас изменю свой ответ, посмотришь.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |