|
Вопрос # 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;
-
- begin
- assignfile(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)} then
- begin
- rezult.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. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|