При выводу в текстовый файл теряется часть информации

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

При выводу в текстовый файл теряется часть информации

Сообщение Йоши » 16.01.2011 20:56:47

Доброго времени суток.
У меня возникла любопытная проблема. Делаю простейшую задачу по рекуррентным последовательностям.
Вычисляем значения аргумента от 1 до 20 в десяти равноотстоящий друг от друга точках с шестью заданными точностями вычислений. Результаты вычислений пишутся в текстовый файл.
Есть два варианта решения задачи: программа пользователя и графическое приложение на LCL. В первом варианте все работает на ура, а в графическом приложении с абсолютно тем же самым кодом возникает что-то непонятное. В конец файла не дописывается часть информации: вся последняя строка и часть предыдущей.
Все вычисления были отслежены пошагово, все они выполняются. Проблема возникает только с записью в файл.

Программа проверялась на версии 0.9.28 на win7 и 0.9.22 на winXP.

Код первой:
Код: Выделить всё
var s, x, gran1, gran2, d, a, eps: real;
    i: integer;
    tab: TextFile;

begin
   writeln ('Vvedite granicy diapazona:');
   readln (gran1, gran2); {прочитаем начало и конец диапазона}

   d:=(gran2-gran1)/9; {вычислим длину одного отрезка}
   x:=gran1; {присваиваем х начальную точку}
   AssignFile (tab, 'iteratio.txt');
   Rewrite (tab); {создаем текстовый файлик}
   while x<=gran2 do  {перебираем точки}
     begin
        eps:=0.1; {задаем первую точность - 1E-1}
       while eps>=0.000001 do {пока точность не достигнет 1E-6...}
        begin
         s:=0; {обнуляем сумму}
         i:=0; {задаем k нулевое}
         a:=(-1)*x; {задаем а такое, чтобы первый член вышел корректно}
         while abs(a)>=eps do {если необходимая точность достигнута, прерываемся}
          begin
           a:=a*(-1)*(2*i-1)/(2*i+1)/sqr(x); {считаем i-ое слагаемое}
           s:=s+a; {сумма + новый член}
           i:=i+1; {следующий круг цикла}
          end;
         s:=pi/2+s; {считаем конечное значение функции}
         writeln ('x=', x:11:8, ', tochnost=', eps:8:6, ', arktangens=', s:10:8, ', vsego ciklov=', i+1);
         writeln (tab, x:11:8, ' ', eps:8:6, ' ', s:10:8, ' ', i+1); {пишем результаты в файл}
         eps:=eps/10; {следующая точность}
        end;
//       writeln (tab, arctan(x):12:8);
       
       x:=x+d; {следующая точка}
     end;

   CloseFile (tab); {закрываем файл}
   readln;
end.                                 


Код второй:
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);

var x, eps, s, a, d, gran1, gran2: real;
    i: integer;
    tab: TextFile;

begin
   gran1:=StrToFloat (Edit1.Text);
   gran2:=StrToFloat (Edit2.Text);
   d:=(gran2-gran1)/9; {вычислим длину одного отрезка}
   x:=gran1; {присваиваем х начальную точку}
   AssignFile (tab, 'iteratio.txt');
   Rewrite (tab); {создаем текстовый файлик}
   while x<=gran2 do  {перебираем точки}
     begin
        eps:=0.1; {задаем первую точность - 1E-1}
       while eps>=0.000001 do {пока точность не достигнет 1E-6...}
        begin
         s:=0; {обнуляем сумму}
         i:=0; {задаем k нулевое}
         a:=(-1)*x; {задаем а такое, чтобы первый член вышел корректно}
         while abs(a)>=eps do {если необходимая точность достигнута, прерываемся}
          begin
           a:=a*(-1)*(2*i-1)/(2*i+1)/sqr(x); {считаем i-ое слагаемое}
           s:=s+a; {сумма + новый член}
           i:=i+1; {следующий круг цикла}
          end;
         s:=pi/2+s; {считаем конечное значение функции}
         writeln (tab, x:11:8, ' ', eps:8:6, ' ', s:10:8, ' ', i+1); {пишем результаты в файл}
         eps:=eps/10; {следующая точность}
        end;
//      writeln (tab, arctan(x):12:8); {рабочая строка - эталон функции}

       x:=x+d; {следующая точка}
       Label4.Caption:='Результаты записаны в файл iteratio.txt';

     end;
end;                                 


Результат в файле первой, последние две строки:
20.00000000 0.000010 1.52083793 4
20.00000000 0.000001 1.52083793 4

Результат в файле второй по этим же двум строкам:
20.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Йоши
незнакомец
 
Сообщения: 2
Зарегистрирован: 16.01.2011 19:13:49
Откуда: Томск

Re: При выводу в текстовый файл теряется часть информации

Сообщение Mr.Smart » 16.01.2011 21:00:06

Во втором случае вы не произвели закрытие файла.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: При выводу в текстовый файл теряется часть информации

Сообщение Йоши » 16.01.2011 21:09:30

И правда :shock:
Вот идиотка блин :oops:

Спасибо огромное!
Аватара пользователя
Йоши
незнакомец
 
Сообщения: 2
Зарегистрирован: 16.01.2011 19:13:49
Откуда: Томск


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 21

Рейтинг@Mail.ru