Модераторы: volvo877, Snowy, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Использование файлов, в TurboPascal 
:(
    Опции темы
SlePoY_SniPeR
Дата 12.9.2006, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 12.9.2006

Репутация: нет
Всего: нет



 smile 
Люди добрые, сижу вот, изучаю TurboPascal (я в институте, 1 курс  smile ) и битый час бьюсь над тем, чтобы запихнуть результаты программы в текстовый файл... Ну никак не получается.. Уж и примеры посмотрел и книжку почитал (дада, в институте и книжку дали smile ) всё равно никак...  smile 

Народ, подскажите как правильно использовать TurboPascal  в этих целях smile (именно сейчас мне надо всего-то запихнуть значения 2... нет, трёх переменных)

Жду...  smile 
PM MAIL   Вверх
Coder
Дата 13.9.2006, 00:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 13.12.2004

Репутация: нет
Всего: 11



Код

var
f : textfile; // указатель на файл

begin
assign(f,'путь_и_имя файла'); // связываем f с файлом
reset(f); // открываем файл, можно так же rewrite(f) и append(f)
write(f,count1,coun2,count3); // пишем в файл переменные
close(f); // закрываем файл
end;

различие между reset, rewrite, append смотри в своей книге (или по чему ты там изучаем)

Это сообщение отредактировал(а) Coder - 13.9.2006, 00:45
PM MAIL   Вверх
Fighter
Дата 13.9.2006, 01:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 810
Регистрация: 5.1.2005

Репутация: нет
Всего: 2



Цитата(Coder @  13.9.2006,  00:43 Найти цитируемый пост)
код Pascal/Delphi1:2:3:4:5:6:7:8:9:
varf : textfile; // указатель на файл
begin
assign(f,'путь_и_имя файла'); // связываем f с файлом
reset(f); // открываем файл, можно так же rewrite(f) и append(f)
write(f,count1,coun2,count3); // пишем в файл переменные
close(f); // закрываем файлend;


Хм, а мне кажется так не правильно. Если конкретно то:


Цитата(Coder @  13.9.2006,  00:43 Найти цитируемый пост)
write(f,count1,coun2,count3); // пишем в файл переменные


эту штуку надо заменить на

Код

  writeln(f, count1);
  writeln(f, count2);
  writeln(f, count3);


Да и еще файл открывается в режиме reset а потом используется процедура write - компилятор стошнит - он выведет ошибку. Перед write нужно rewrite. 

Вот пример:

Код

var
  int1, int2, int3: integer;
  f: text;
begin
  int1 := 2;
  int2 := 4;
  int3 := 6;
  assign(f, 'd:\file.txt');
  rewrite(f);
    write(f, int1, int2, int3);
  close(f);
end.


В результате выполнения этого кода в файл d:\file.txt запишется строка 246 (а не отдельно 2 4 6), в следствие чего после выполнения кода

Код


var
  int1, int2, int3: integer;
  f: text;
begin
  assign(f, 'd:\file.txt');
  reset(f);
    read(f, int1, int2, int3);
  close(f);
  readkey;
end.


В переменную int1 запишется число 246, а не 2 как скорее всего задумывалось. Остальные переменные примут нулевые значения.
Выход в том чтобы вместо записи всех переменных в вызове одной процедуры write выполнять запись через процедуры writeln. Да, кстати, процедура write не переносит курсор на новую строку а вот writeln переносит - это вы уже знаете, и кстати, тоже самое применимо и к файлам.



Режимы открытия:
Для работы с файлами нужно объявить файловую переменную. Вообще файлы бывают нескольких типов, но так как ты выбрал тектовый я от этого и буду отходить.

Чтобы использовать текстовый файл тебе нужно объявить текстовую переменную, например:

Код

  ... 

  var
    f: text;

  ...


Затем эту переменную нужно связать с каким-нибудь конкретным файлом на диске, и это все не так сложно и делается это через процедуру Assign, т.е. вот так

Код

  ...
  Assign(f, <имя файла>)
  ...


После того как переменная связана, с файлом нужно что-то сделать. Вот все то что мы сможем сделать с файлами:

rewrite(<файловая переменная>) - открыть файл для записи (если такой файл существует, то тогда все записи в нем будут удалены, а если  нет - то тогда будет создан новый файл)
reset(<файловая переменная>) - открыть файл для чтения.
append(<файловая переменная>) - открыть файл для того чтобы в него добавить записи.

После того как мы открыли файл, то мы можем использовать процедуры read/write, readln/writeln для чтения/записи. По своему опыту скажу тебе, что все-таки чаще всего приходилось использовать writeln/readln для работы с файлами, нежели read/write.

В конце работы с файлом не забываем закрывать его

close(<файловая переменная>).


Это сообщение отредактировал(а) Fighter - 13.9.2006, 01:16
PM MAIL   Вверх
SlePoY_SniPeR
Дата 13.9.2006, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 12.9.2006

Репутация: нет
Всего: нет



Спасибо всем, кто отписался в этом топике, ибо в принципе я разобрался smile Вроде бы :\

В общем, перед тем как взяться за свою лабу по инфе, решил написать банальную программулину, которая решает квадратное уравнение и все ответы запихивает в файл... Код набил минут за 15, + 2 с лишним часа мучался над тем, как засунуть результаты в файл (ну никак не получается)... Взгляните, пожалуйста на код, может я что-то не так сделал?
Собственно, код: 

Цитата

program KVADRUR(INPUT, OUTPUT);
VAR
A,B,C,X1,X2,D,T:REAL;
F:Text;
BEGIN
READ (A,B,C);
D:=SQR(B) - 4*A*C;
     IF (A=0) AND (B=0) AND (C=0) THEN
        WRITELN('The equation has infinite set of decisions')
                                  ELSE
     IF (A=0) AND (B=0) AND (C<>0) THEN
        WRITELN('The equation has no decisions')
                     else
                     if (A=0) AND (B<>0) AND (C<>0) then
                        writeln('The equation has a decision x=' , C/B)
                                     else
                        if D<0 then
                         writeln('The equation has a complex decisions')
                                      else
                        if D=0 then
                        T:=-B/2*A;
                        writeln('The equation has 1 decision x',T);

        BEGIN
        X1:=((-B+SQRT(D))/2*A);
        X2:=((-B-SQRT(D))/2*A);

        WRITELN('Decisions of this square equation are: X1,x2=',X1,X2);
                              
                              END;
        BEGIN
        Assign(F,'res.txt');
        Rewrite(F);
        Write(F,X1,+',',+X2);
        Close(F)
                        END;
END.


Вот содержимое файла RES.TXT:

 3.1400000000E+02,-3.1100000000E+02

Это сообщение отредактировал(а) SlePoY_SniPeR - 13.9.2006, 20:43
PM MAIL   Вверх
volvo877
Дата 13.9.2006, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 2
Всего: 116



Цитата(SlePoY_SniPeR @  13.9.2006,  20:07 Найти цитируемый пост)
Когда компилирую программу, не появляется никакого ЕХЕ-шника

Compile -> Destination не в Memory часом установлено?

Цитата(SlePoY_SniPeR @  13.9.2006,  20:07 Найти цитируемый пост)
Может я что-то не так делаю?

Не форматируешь программу, поэтому не видишь очевидного... Вот, смотри, как ТВОЯ ЖЕ программа выглядит при соблюдении отступов:

Код
program KVADRUR(INPUT, OUTPUT);
VAR
  A,B,C,X1,X2,D,T:REAL;
  F:Text;
BEGIN

  READ (A,B,C);
  D:=SQR(B) - 4*A*C;

  IF (A=0) AND (B=0) AND (C=0) THEN
    WRITELN('The equation has infinite set of decisions')
  ELSE
    IF (A=0) AND (B=0) AND (C<>0) THEN
      WRITELN('The equation has no decisions')
    else
      if (A=0) AND (B<>0) AND (C<>0) then
        writeln('The equation has a decision x=' , C/B)
      else
        if D<0 then
          writeln('The equation has a complex decisions')
        else
          if D=0 then T:=-B/2*A;

  writeln('The equation has 1 decision x',T);

  BEGIN
    X1:=((-B+SQRT(D))/2*A);
    X2:=((-B-SQRT(D))/2*A);

    WRITELN('Decisions of this square equation are: X1,x2=',X1,X2);

  END;

  BEGIN
    Assign(F,'res.txt');
    Rewrite(F);
    Write(F,X1,X2);
    Close(F)
  END;

END.
Так что делается при D = 0? И когда будет печататься, что "Уравнение имеет одно решение"?
PM MAIL   Вверх
SlePoY_SniPeR
Дата 13.9.2006, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 12.9.2006

Репутация: нет
Всего: нет



Цитата

Compile -> Destination не в Memory часом установлено?

Ага, уже на каком-то форуме вычитал, поменял... Все теперь с этим ок...

Цитата

Так что делается при D = 0? И когда будет печататься, что "Уравнение имеет одно решение"?


        else
          if D=0 then 
               T:=-B/2*A;
    writeln('The equation has 1 decision x',T);

Да вроде все описал :\

У меня вот теперь проблема с содержимым res.txt. Вот содержимое:

 3.1400000000E+02,-3.1100000000E+02

(эт при уравнении x^2 -3x -4 | ну так, для примера взял...) Как в человеческие цифры все это перевести? 
PM MAIL   Вверх
volvo877
Дата 13.9.2006, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 2
Всего: 116



Цитата(SlePoY_SniPeR @  13.9.2006,  20:48 Найти цитируемый пост)
Да вроде все описал :\

Да не все... Насколько я понимаю в программировании, тебе надо, чтобы при D = 0 выполнялось И это
Код
T:=-B/2*A;

И вот это:
Код
writeln('The equation has 1 decision x',T);
 (поправь меня, если я ошибаюсь...) А у тебя выполняется только первое... Вторая приведенная мной строка (и все, что ниже нее по тексту) выполняется не только в случае D = 0, а всегда, ибо ВСЕ условия уже закончились... Вот тебе, кстати, пример, почему это плохо:

попробуй уравнение X^2 + 2*X + 3 = 0
Что должно получиться? Нет действительных корней, т.к. D < 0? А программа вылетит с ошибкой, когда попытается извлечь корень из отрицательного числа...

Цитата(SlePoY_SniPeR @  13.9.2006,  20:48 Найти цитируемый пост)
Как в человеческие цифры все это перевести?  

Код
Write(F,X1:15:10, X2:15:10);

PM MAIL   Вверх
Fighter
Дата 14.9.2006, 05:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 810
Регистрация: 5.1.2005

Репутация: нет
Всего: 2



Хорошо, тогда вопрос. А как тогда при таком содержимом файле ты будешь считывать это все если тебе понадобится?

Не лучше ли использовать:

Код

  writeln(f, x1);
  writeln(f, x2);

PM MAIL   Вверх
albertn
Дата 14.9.2006, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 368
Регистрация: 17.7.2006
Где: г. Ставрополь

Репутация: нет
Всего: 34



volvo877, ты кстати тоже не совсем правильно отформатировал лесенку операторов if - else - if, к тому же что у тебя программа выведет при A=0,B<>0,C=0?

К тому-же в нем begin и end стоят не там, где надо.
PM WWW ICQ   Вверх
volvo877
Дата 14.9.2006, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 2
Всего: 116



albertn, 
я вообще ничего в программе не менял... Я ж написал: 
Цитата(volvo877 @  13.9.2006,  20:42 Найти цитируемый пост)
Вот, смотри, как ТВОЯ ЖЕ программа выглядит при соблюдении отступов:


Добавлено @ 16:48 
Я просто попытался показать автору его ошибки. Как видно, он этого не понял, или не захотел понять. Дело его...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle
Rrader
volvo877

Запрещается!

1. Обсуждать и делится взломанными компонентами или программным обеспечением

2. Публиковать ссылки на варез

3. Оффтопить

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема »


 




[ Время генерации скрипта: 0.0581 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.