Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.03.2010, 19:58   #1
Zerofill
Пользователь
 
Регистрация: 31.05.2009
Сообщений: 29
Печаль Не ищется слово в файле, которое там точно присутствует

Здравствуйте, уважаемые форумчане.
Вот такая у меня проблемка. Я считываю текстовый файл для поиска и фиксации необходимой информации. Затем, мне необходимо заново считать этот файл, т.к. некот информация, которая мне нужна после первого просмотра, содержится ближе к началу файла. Но эту информацию я смогу использовать только после того, как прочитаю нужные данные в конце файла, поэтому так получается, что мне необходимо два раза перечитывать файл. Но почему-то при запуске нового цикла считывания и при проверке условия наличия заданного слова в строке (а это слово в файле ЕСТЬ!) это самое условие не выполняется. Т.е. слово не находится. Файл просматривается, но данные я зафиксировать не могу. Объясните, пожалуйста, в чем моя ошибка.
Код:
l:=0;
while l<fs.Count do begin //считываем файл построчно
      st:=fs.Strings[l];
      if ins=0 then int:=pos('b2v_inst :',st) //поиск элемента по идентификатору
      else int:=pos('b2v_inst'+inttostr(ins)+' :',st);
      if int<>0 then
      begin line:=l; 
            inc(line);
            if pos('clock =>',fs.Strings[line])<>0 then //эту строчку пропускаем
                   inc(line);
            while pos('=> ',fs.Strings[line])<>0 do 
            begin
                  if (pos('data',fs.Strings[line])<>0) or (pos('in',fs.Strings[line])<>0) then
                  begin   //считываем имя входа элемента
                        t:=3; p:='';
                        repeat
                          p:=p+fs.Strings[line][pos('=> ',fs.Strings[line])+t];
                          inc(t);
                        until (fs.Strings[line][pos('=> ',fs.Strings[line])+t]=',') or
                        (fs.Strings[line][pos('=> ',fs.Strings[line])+t]=')');
                        setlength(el[curr].inp,isize);   
                        el[curr].inp[cur].ins:=p;//заносим в динамический массив, содержащий имена входов элемента с индексом curr
                        inc(cur); inc(isize);
                  end
                  else
                  if (pos('q',fs.Strings[line])<>0) or (pos('out',fs.Strings[line])<>0) or
                  (pos('result',fs.Strings[line])<>0) or (pos('overflow',fs.Strings[line])<>0) then begin //аналогично поступаем с выходами
                        ...
                  end;
                  inc(line);
            end;
            l:=fs.Count; //для данного элемента работа с файлом закончена, выходим из цикла
      end
      else inc(l);
end;
for co:=0 to fs.Count-1 do begin //снова считываем файл
    if pos('SIGNAL ',fs.Strings[co])>0 then begin //слово "SIGNAL" присутствует в файле, но не находится
        for b:=0 to length(el[curr].inp)-1 do //массив имен входов НЕ пустой
        begin
              if pos(el[curr].inp[b].ins,st)<>0 then begin
                    if st[pos('STD_LOGIC',st)+9]=';' then el[curr].inp[b].size:=1
                    else begin
                          t:=8; p:='';
                          while st[pos('_VECTOR(',st)+t]<>' ' do begin
                               p:=p+st[pos('_VECTOR(',st)+t];
                               inc(t);
                          end;
                          el[curr].inp[b].size:=strtoint(p)+1; //разрядность 
                    end;  end;
        end;
        for b:=0 to length(el[curr].outp)-1 do
        begin
              if pos(el[curr].outp[b].outs,st)<>0 then  begin
                    if st[pos('STD_LOGIC',st)+9]=';' then el[curr].outp[b].size:=1
                    else begin
                          t:=8; p:='';
                          while st[pos('_VECTOR(',st)+t]<>' ' do begin
                               p:=p+st[pos('_VECTOR(',st)+t];
                               inc(t);
                          end;
                          el[curr].outp[b].size:=strtoint(p)+1;
                    end;  end;
        end;
    end;
end;
Заранее спасибо за беспокойство.

Последний раз редактировалось Zerofill; 30.03.2010 в 20:02.
Zerofill вне форума Ответить с цитированием
Старый 30.03.2010, 21:35   #2
RUSt88
Участник клуба
 
Регистрация: 29.12.2009
Сообщений: 1,166
По умолчанию

даже не знаю, что сказать...
напишите свою процедуру поиска

например вот, функция PosK(subS,S,k) целого типа, возвращающую номер позиции, с которой в строке S содержится k-е вхождение подстроки subS (k>0). Если количество вхождений subS в строке S меньше k, то функция возвращает 0

ищет строку SubS в строке S с вхождения K
Код:
function PosK(SubS: string; S: string; K: Word): Integer;
var
  i, l1, l2, p, j, q, w: Integer;
begin
  l1 := Length(s); l2 := Length(SubS); // заносим в переменные длины строк
  i := 1; q := 0; p := 0; w := 0;
  for i := 1 to l1 do begin // цикл по строке, в которой ищем
    if (s[i] = SubS[1]) then begin // если 1 символ искомой строки совпадает
      for j := 1 to l2 do begin // цикл по искомой строке все ли символы совпадают
        if s[i + j - 1] = SubS[j] then begin
          inc(q); // если символ искомой строки совпадает, то делаем перемен +1
        end
        else begin
          q := 0; // если нет совпадения 
          Break; // то выходим из поиска символов искомой строки и начинаем сначала
        end;
      end;
    end
    else begin
      q := 0; // если первый символ не совпадает
    end;
    if q = l2 then begin // если вся искомая строка найдена
      Inc(p); //счетчик сколько найдено подстрок в строке
      w := i; // запоминаем позицию
    end;
    if p = K then Break; // если счетчик равен входному параметру, то выходим из поиска
  end;
  if (p < K) then
    Result := 0 // если совпадений не найдено или меньше чем нужно
  else // в противном случае
    Result := w; // возвращаем позицию подстроки
end;
прогер C\C++\C#\Delphi
ася: [семь 3]-[97]-[1 шесть]
RUSt88 вне форума Ответить с цитированием
Старый 04.04.2010, 18:41   #3
Zerofill
Пользователь
 
Регистрация: 31.05.2009
Сообщений: 29
По умолчанию

Спасибо за отзывчивость. Проблема решена. Ошибка наиглупейшая. У меня в цикле
Код:
for co:=0 to fs.Count-1 do begin
не хватает st:=fs.Strings[со]; ведь дальше я использую именно переменную st
вот ведь бывает))

Последний раз редактировалось Zerofill; 04.04.2010 в 18:44.
Zerofill вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дано 2 слова. Написать программу, которая будет определять присутствует ли слово 1 в слове 2. Паскалька^^ Помощь студентам 5 19.10.2010 00:55
PHP.Как посчитать, сколько раз слово встречается в файле? Princesse Помощь студентам 0 07.12.2009 00:24
Почему мат процессор не считает точно sin(pi) = 0? FPU128bit Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 27.10.2009 17:03
CountFunc(f), которая определяет, сколько раз в файле встретилось слово "function". ArtS Паскаль, Turbo Pascal, PascalABC.NET 3 24.05.2009 19:21
в текстовом файле в каждой строке наити самое длинное слово Storm Помощь студентам 4 04.06.2008 15:56