Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 594

/ вопрос закрыт /

Здравствуйте!
Не могу понять почему не записывает в файл, пробовал ставить условие как if strtoint(title)>50 then так и if strtoint(title)<50 then

Прикол в чем, программа берет адрес сайта из первого файла выполняет запрос к сервису, получает ответ, с текста выпарсевается значение ТИЦ сайта (число) первый сайт имеет значение 200 но, программа должна проверить это значение и если оно больше 50 то записать адрес сайта в файл. Но почему-то ничего не происходит. Значение выпарсивает тоесть строка button1.Caption:=title; меняет текст на кнопке на 200, а в файл не записывает, моежет я гдето ошибся, уже два часа долбюсь найти ошибку не могу.

Прошу помощи, заранее благодарен!

Приложение:
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var
  3. rss,rss1,title,link:WideString;
  4. url:string;
  5. f,f1,f2:Textfile;
  6. i:integer;
  7. begin
  8.  
  9. assignfile(f,'c:\DleSites.txt');
  10. assignfile(f1,'c:\DleSites2.txt');
  11. Append(f1);
  12. assignfile(f2,'c:\Dle.txt');
  13. Append(f2);
  14. reset(f);
  15. //while not eof(afile) do
  16. // begin
  17. readln(f,url);
  18. writeln(f1,url);
  19. rss:=IdHTTP1.Get('http://shelkovo.org/pr-cy/?url='+url);
  20. i:=1;
  21. title:='';
  22. while (i<=length(rss)) do
  23. begin
  24.  
  25. begin
  26.  
  27. title:=copy(rss,1,pos('</font><br>',rss)-1);
  28. button1.Caption:=title;
  29. if strtoint(title)>50 then
  30. begin
  31. writeln(f1,url);
  32. write (f1,'--'+title);
  33.  
  34. CloseFile(f);
  35. end;
  36. i:=0;
  37. end; // end;
  38. inc(i);
  39. end;
  40. end;


Шарайчук Сергей Олександрович Вопрос закрыт (ответы не принимаются, мини-форум закрыт)

Вопрос задал: Шарайчук Сергей Олександрович (статус: 2-ой класс)
Вопрос отправлен: 22 августа 2011, 16:24
Состояние вопроса: закрыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 16; последнее сообщение — 23 августа 2011, 00:39; участников в обсуждении: 4.
min@y™

min@y™ (статус: Доктор наук), 22 августа 2011, 16:32 [#1]:

Цитата (Шарайчук Сергей Олександрович):

Не могу понять почему не записывает в файл, пробовал ставить условие как if strtoint(title)>50 then так и if strtoint(title)<50 then

А может title = "50"?
Воспользуйся отладчиком, посмотри, как исполняется код, и значения переменных.

З.Ы. Удивляют индивиды, пытающиеся писать интернет-приложения с использованием паскалевских I/O-функций. Выглядит это, как картины Сальвадора Дали, чесслово!
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Вадим К

Вадим К (статус: Академик), 22 августа 2011, 16:35 [#2]:

если бы title был бы "50", тогда было бы исключение.
Похоже тут дело в том, что файлы не закрываются. А раз не закрываются, то и запись не сохраняется:). Все просто. (файл не обязан записываться физически на диск, если его не закрыли через closefile)
Галочка "подтверждения прочтения" - вселенское зло.
Шарайчук Сергей Олександрович

Шарайчук Сергей Олександрович (статус: 2-ой класс), 22 августа 2011, 16:44 [#3]:

min@y™: нет title какраз не "50", именно для этого я вывожу значение title перед проверкой, выдает 200...

P.S. Если есть что предложить вместо I/O-функций с удовольствием выслушаю.
Вадим К: спасибо, так заработало :) глупая ошибка :)
Я бы изменил мир, но Бог не дает исходники!
min@y™

min@y™ (статус: Доктор наук), 22 августа 2011, 16:45 [#4]:

Цитата (Вадим К):

если бы title был бы "50", тогда было бы исключение.

Ну, не придирайся. Ты же понял, о чём я хотел сказать.
Про CloseFile() ты, конечно, прав. Я не заметил, что не все файлы закрываются. Однако, я, всё-таки, за то, чтобы навсегда забыть паскалевские I/O-функции.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 22 августа 2011, 16:46 [#5]:

Цитата (Шарайчук Сергей Олександрович):

Если есть что предложить вместо I/O-функций с удовольствием выслушаю.

TMemoryStream, TFileStream, TStringList.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Вадим К

Вадим К (статус: Академик), 22 августа 2011, 16:47 [#6]:

старые I/O-функции хороши. И часто они очень хорошо справляются с задачей. Но min@y™ предлагает пользоваться достижениями цивилизации и использовать TFileStream и подобные.
Что выбирать - дело вкуса. Но почему он не заметил, что у Вас есть куда больше проблема - ручной парсинг xml. Вот это уже очень плохо.
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 22 августа 2011, 16:52 [#7]:

Цитата (Вадим К):

Но почему он не заметил, что у Вас есть куда больше проблема - ручной парсинг xml.

Судя по коду, там и парсить-то нечего.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Вадим К

Вадим К (статус: Академик), 22 августа 2011, 16:56 [#8]:

я по слову rss почему то решил, что там rss и соответсвенно xml. А там обычный html.
Галочка "подтверждения прочтения" - вселенское зло.
Шарайчук Сергей Олександрович

Шарайчук Сергей Олександрович (статус: 2-ой класс), 22 августа 2011, 17:07 [#9]:

возник следующий вопрос, кинул на форму antifreeze, вставил процедуру sleep(60);

но программа посл записи первого значения в файл тупо висит

procedure TForm1.Button1Click(Sender: TObject);
var
 rss,rss1,title,link:WideString;
 url:string;
   f,f1,f2:Textfile;
 i:integer;
begin
 
 assignfile(f,'c:\DleSites.txt');
 assignfile(f1,'c:\DleSites2.txt');
 
 assignfile(f2,'c:\Dle.txt');
    Append(f2);
 reset(f);
while not eof(f) do
begin
 readln(f,url);
   rss:=IdHTTP1.Get('http://shelkovo.org/pr-cy/?url='+url);
   i:=1;
   title:='';
   while (i<=length(rss)) do
    begin
     if pos('<font size="3"><strong>тИЦ</strong>: ',rss)<>0 then
      begin
      Delete(rss,1,pos('<font size="3"><strong>тИЦ</strong>: ',rss)+length('<font size="3"><strong>тИЦ</strong>: ')-1);
       title:=copy(rss,1,pos('</font><br>',rss)-1);
       button1.Caption:=title;
       if strtoint(title)>50 then
       begin
       Append(f1);
       writeln(f1,url);
       CloseFile(f);
       CloseFile(f1);
       sleep(60);
        end;
       i:=0;
 
 
 
      end;     end;
     inc(i);
    end;
end;
Я бы изменил мир, но Бог не дает исходники!
Amidamaru

Amidamaru (статус: 4-ый класс), 22 августа 2011, 17:08 [#10]:

а я вот смотрю на код, и не пойму, а зачем вообще открывается f2?
Приглашаю Вас на наш IRC-канал: #delphiintru в сети DalNet.
Шарайчук Сергей Олександрович

Шарайчук Сергей Олександрович (статус: 2-ой класс), 22 августа 2011, 17:11 [#11]:

я по слову rss почему то решил, что там rss и соответсвенно xml. А там обычный html.
я просто код из другой своей проги вытащил, мне на даном этапе нужно только перелапатить файл с несколькими сотнями ссылок и отсеять все где ТИЦ меньше 50...
Я бы изменил мир, но Бог не дает исходники!
Amidamaru

Amidamaru (статус: 4-ый класс), 22 августа 2011, 17:15 [#12]:

а может strtoint не рассчитан на widestring?
попробуй
if strtoint(button1.Caption)>50 then
Приглашаю Вас на наш IRC-канал: #delphiintru в сети DalNet.
Шарайчук Сергей Олександрович

Шарайчук Сергей Олександрович (статус: 2-ой класс), 22 августа 2011, 17:20 [#13]:

if strtoint(button1.Caption)>50 then
от зависания не спасло
Я бы изменил мир, но Бог не дает исходники!
Вадим К

Вадим К (статус: Академик), 22 августа 2011, 17:23 [#14]:

проблема опять с закрытием файла. Открываете Вы их вне цикла, а закрываете внутри. Понятно, что после того, как файл закрыт, запись туда невозможна. то, что оно виснет - это просто ещё повезло.
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 22 августа 2011, 17:57 [#15]:

Предлагаю переписать этот говнокод с нуля, разделив задачу на подзадачи (функции).
1. Закачка в TMemoryStream и сохранение в TStringList.
2. Парсинг TStringList.
3. Сохранение в файл.
И не надо морочить себе голову.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

22 августа 2011, 21:29: Вопрос перемещён из тематического раздела Delphi » Общие вопросы по программированию в раздел Delphi » Работа с файловой системой модератором Ерёмин А.А.

Amidamaru

Amidamaru (статус: 4-ый класс), 23 августа 2011, 00:39 [#16]:

min@y™: это конечно было бы замечательно, но если Сергей Олександрович не хочет менять код так кардинально, то я бы просто предложил работать с файлами через TStringList'ы. Ведь файлы - текстовые и так работать будет намного проще.
Приглашаю Вас на наш IRC-канал: #delphiintru в сети DalNet.

23 августа 2011, 18:41: Вопрос закрыт (решение принял автор вопроса — Шарайчук Сергей Олександрович): Вопрос частично решен, переписал код, и сейчас хочу создать новый вопрос который будет отличаться от это но будет решать именно эту проблему :)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:58
Выполнено за 0.03 сек.