Всем доброго времени суток,
Ситуация: есть текстовый файл, в нём записан каталог товаров в виде: строка (несколько слов) - название, на следующей строке - цена, ниже пустая строка и следующий товар в том же формате.
Нужно реализовать такую вещь: пользователь вводит слово, по нему осуществляется поиск и делается выборка тех товаров, в названии которых встречается искомое слово.
Вопрос: подскажите плз, как это сделать, у меня проблема с тем, что названия товаров состаят из 3-7 слов, везде по разному + не знаю, как организовать разделение товаров для скрипта, как вообще осуществляется перемещение указателя на следующую строчку, при чтении из файла. Иными словами: как сделать так, чтобы если в строке встречается заданное слово, скрипт её выводил + следующую, потом проскакивал пустую и делал поиск в следующей строке.
Заранее благодарен.
Читать всю строку полностью (неважно, сколько в ней слов, главное - чтоб было меньше 256 символов) через ReadLN(f, s), искать в ней подстроку через Pos, и проверять результат... Ну, а "проскочить" пустую строку - пустым ReadLN(f) ...
спасибо, приведи пожалуйста кусок кода..
для базы:
ААА ПП
22
ЕЕ ПП
55
Если не трудно, конечно..
В чем сложность?
Write('query = '); ReadLn(query);
while not eof(f) do begin
readln(f, s);
if pos(query, s) > 0 then begin
readln(f, price) { <--- если название совпало - читаем цену }
writeln('found: ', s, ' -> ', price); { <--- и выводим на печать ... }
end;
else readln(f); { <--- иначе - пропускаем строку с ценой }
readln(f); { <--- Пустую строку пропускаем в любом случае }
end;
Большое спасибо, проблема решена!
Вероятно я туплю жутко, но у меня не работает, Error 113: Error in statment , после else. Не понимаю, без else всё работает, а с ним не хочет, в чём может быть ошибка?
__
добавлено: если убрать ; после end перед else - работет, но выводит только одну запись, первую, где встретится нужное слово, а не все..
Там точка с запятой (перед Else) не нужна просто... Убери ее, и все заработает.
если убрать ; после end перед else - работет, но выводит только одну запись, первую, где встретится нужное слово, а не все..
Не может быть... Тогда показывай программу ПОЛНОСТЬЮ. Чего-то ты намудрил...
Programm test;
USES CRT;
var
f:text;
name,s,query,price: string[80];
BEGIN
assign(f,'n:\base.txt');
reset (f);
Write('query=');
Readln(query);
while not eof(f) do
begin
readln(f,s);
if pos(query,s) > 0 then
begin
readln(f,price);
writeln ('found:',s,'->',price);
end
else readln(f);
readln(f);
end;
end.
Ты это здесь набирал? Тогда меня ЭТО не интересует, ты уже внес ошибки при наборе... Я в "глухие телефоны" не играю. Присоединяй аттачем ТВОЙ файл, который у тебя не работал, ибо то, что есть в предыдущем посте ДАЖЕ не скомпилируется!
Нет, я оттуда брал, может случайно что-то менял, вот копия из бэкапа, работает, проверял.
Program TTP;
USES CRT;
var
f: text;
name,s,query,price: string[80];
BEGIN
assign(f,'n:\ttp.txt');
reset (f);
Write('query=');
Readln(query);
while not EoF(f) do
begin
readln(f,s);
if pos(query, s) > 0 then
begin
readln(f,price);
writeln ('found:',s,'->',price);
end
else readln(f);
readln(f);
end;
end.
Заработало, нашёл ошибку. Спасибо за помощь, сорри за тупизм )