| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Центр помощи > [Delphi] ошибка txt фаил |
| Автор: kyky15 25.12.2011, 21:27 |
| Помогите пожайлуста. Найти в чем ошибка! Надо создать txt фаил с рекордами(3 строчки) и вывести в меммо. В эдите я ввожу имя оно записывается в txt фаил и на др форме показывается в меммо. При выводе на экран в меммо выводит 3 строчки, первую ту которую занисли а 2 цифры непонятные |
| Автор: Данкинг 25.12.2011, 22:06 |
| А какая ошибка-то? |
| Автор: kyky15 26.12.2011, 11:55 |
| цифры в первой строчке выводятся...не знаю откуда. |
| Автор: Данкинг 26.12.2011, 13:34 |
| Какие цифры, и вообще зачем ты код удалил? |
| Автор: Данкинг 26.12.2011, 13:34 |
| Какие цифры, и вообще зачем ты код удалил? |
| Автор: kyky15 26.12.2011, 15:03 |
| procedure records(rop:Integer); type rec=record name:string; n:Integer; end; var str:string; a,i,j,k:Integer; r:rec; d:array [1..4] of rec; fa:Text; begin Assign(fa,'ðåêîðäû.txt'); Reset(fa); i:=1; while not Eof(fa) do begin readln(fa,str); if str<>'' then begin i:=1; i:=i+1; end; a:=Pos(' ',str); d[i].name:=Copy(str,0,a-1); d[i].n:=StrToInt(Copy(str,a+1,Length(str))); i:=i+1; end; d[i].name:=Form9.edt1.Text; d[i].n:=rop; k:=1; //ñîðòèðîâêà ìàññèâà d[i].n if i=4 then begin for k:=i downto 2 do for j:=1 to k-1 do if d[j].n>d[j+1].n then begin r:=d[j]; d[j]:=d[j+1]; d[j+1]:=r end; Rewrite(fa); repeat writeln(fa,d[k].name,' ',d[k].n); k:=k+1; until k>3; end else begin k:=1; Rewrite(fa); repeat writeln(fa,d[k].name,' ',d[k].n); k:=k+1; until k>i; end; Close(fa); end; Вот он код,дело в том что когда пользователь выйгрывает ему предлагается ввести своё имя для таблицы рекордов. Когда он вводин в фаил записывается это имя и записывается его результат. <ИМЯ> через пробел <ЧИСЛО с РЕЗУЛЬТАТОМ>. В др форме вывожу в меммо. Кода открываем табл рикордов в первой строчке идут тупо какие то цифры 4567345 а потом только 2 оставшиеся строчки те имена которые заносятся и то не отсортированные(просто добаленная новая строчка в конец). |
| Автор: Mirkes 6.1.2012, 17:49 |
| Вообще говоря ошибок тьма. Например if str<>'' then begin i:=1; i:=i+1; end; этот фрагмент сбрасывает нумерацию прочитанных записей в 2 после каждой НЕ пустой строки. Посему даже если у Вас 100 записей вы их все прочитаете во вторую. Нигде нет контроля того, что вы прочитали не более 4 записей, так что за милую душу получите RangeCheckError Сортировка производится только если на выходе из цикла чтения i=4, что возможно только при наличии в кнце файла 2-х пустых строк. Символы строк в Паскале нумеруются с 1, а не с 0. Фрагмент a:=Pos(' ',str); d[i].name:=Copy(str,0,a-1); d[i].n:=StrToInt(Copy(str,a+1,Length(str))); выполняется и для пустых строк. Должны возникать RunTimeError. Если не возникали, то вы читали всего один элемент массива - второй. Следующий фрагмент k:=1; //ñîðòèðîâêà ìàññèâà d[i].n if i=4 then begin for k:=i downto 2 do for j:=1 to k-1 do if d[j].n>d[j+1].n then begin r:=d[j]; d[j]:=d[j+1]; d[j+1]:=r end; Rewrite(fa); repeat writeln(fa,d[k].name,' ',d[k].n); k:=k+1; until k>3; В любой приличной версии Паскаля (PascalABC не предлагать) после цикла по k значение этой переменной считается неопределенным - произвольный мусор. И уж точно не 1. Думаю, что если убрать тот мусор, о котором я уже написал И тот, кторого я, возможно, не заметил, то результаты работы программы станут более предсказуемыми. |