Форум программистов, компьютерный форум, киберфорум
Free Pascal
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
1 / 1 / 0
Регистрация: 10.04.2023
Сообщений: 15

Написать программу фильтр для вывода строк из файла

10.04.2023, 23:27. Показов 3652. Ответов 26

Студворк — интернет-сервис помощи студентам
Всем привет, изучаю pascal, есть задача:
1.Найти в тексте строку с нужным мне словом ( слово задается пользователем)
2.При нахождении нужного слово в строке сделать вывод еще двух последующих строк

Пример
тратар тра ( слово ) тра тра ( если нашли слово то выводим 2 следующие строчки )
тра тра тра тра ( 1 строка которую нужно вывести )
тра тра тра тра ( 2 строка которую нужно вывести )

Помогите пожалуйста дописать вывод двух следующих строк.


Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
program find;                                                                                                                       
    var                                                                                                                              
 s,s1:string;                                                                                                                        
 count:word;                                                                                                                         
 t:text;                                                                                                                             
 a:integer;                                                                                                                          
 begin                                                                                                                               
 readln(s);     {вводим запрос}                                                                                                      
 assign(t,'red.txt');                                                                                                                
 reset(t);                                                                                                                           
 s1:='';                                                                                                                             
 count:=0;                                                                                                                           
 a:=1;                                                                                                                               
    while not eof(t)  do                                                                                                             
    begin                                                                                                                            
 readln(t,s1);                                                                                                                       
 inc(count);                                                                                                                         
    if (pos(s,s1)=0) then                                                                                                            
    s1:=''                                                                                                                           
    else                                                                                                                             
 writeln(count,' ',s1); {выводим номер строки и строку с найденным по запросу словом }                                                                                                              
    end;                                                                                                                             
 close(t);                                                                                                                           
 end.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.04.2023, 23:27
Ответы с готовыми решениями:

Написать программу для вывода на экран нескольких строк символов
как сделать на две строки чтоб он запрашивал строку один и два и выводил 2 символа. .model compact ; Сегмент стека s_seg segment ...

Написать программу с использованием функций 3Fh и 40h для ввода и вывода строк на экран.
Написать программу с использованием функций 3Fh и 40h для ввода и вывода строк на экран. Символы копировать через стек с помощью команд...

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

26
1 / 1 / 0
Регистрация: 10.04.2023
Сообщений: 15
11.05.2023, 15:08  [ТС]
Студворк — интернет-сервис помощи студентам
Не могли бы вы объяснить почему вы именно так вызываете процедуру???
Scan(ExtractFilePath(ParamStr(0)));
0
 Аватар для mr-Crocodile
3054 / 1673 / 657
Регистрация: 19.03.2019
Сообщений: 5,380
11.05.2023, 15:30
Цитата Сообщение от Mixer124 Посмотреть сообщение
Работает, и так ' *.* ' и так '*' .
ты не понял, о чём я сказал.
я сказал, что если ты задашь маску другую, например, '*.txt' то поиск в подкаталогах у тебя перестанет работать.
Ну, не проверял, но должен перестать (думаю, каталоги не будут выбираться FindFirst\FindNext по заданной конкретной маске).

про смену каталога тебе уже ответил volvo

ну и последнее.
А почему ты так упорно избегаешь вопроса про FindAllFiles ?

Добавлено через 2 минуты
Цитата Сообщение от Mixer124 Посмотреть сообщение
Не могли бы вы объяснить почему вы именно так вызываете процедуру???
Pascal
1
Scan(ExtractFilePath(ParamStr(0)));
Вызвать процедуру и передать ей в качестве параметра имя папки, где находится твоя программа.

То есть программа будет производить поиск в папках рядом с собой.
Это просто в качестве примера приведено.
Ты можешь указать свой путь, в данном случае это не принципиально.
0
1 / 1 / 0
Регистрация: 10.04.2023
Сообщений: 15
11.05.2023, 17:40  [ТС]
Спасибо за обратную связь, действительно ChDir не нужен, видимо я вчера заработался))))
Код поправил!

Добавлено через 6 минут
Ну да если маска ' *.txt ' будет то процедура работать не будет по этому я в конце делаю сортировку по расширению.
По поводу функции FindAllFiles я с ней ознакомился, протестирую, просто я не мог разобраться с FindFirst и FindNext, это уже было дело принципа, сделать программу с применением таких функций, да и в целом для обучения это не будет лишним, хоть и 2 дня провозился с кодом, но сделал, даже почти правильно)

Но мне почему то кажется, что FindFirst более гибок в плане поиска файлов, там есть возможность фильтровать определенные папки что бы программа попросту в них даже не обращался за поиском файлов, это очень удобно оп моему мнению, так же можно реализовать в одной процедуре не только поиск txt можно добавить много других расширений, тоже большой плюс.

Хотя я не знаю все возможностей FindAllFiles, можно ли там так сделать, то что я описал вышил??
Спасибо за ответ!
0
1 / 1 / 0
Регистрация: 10.04.2023
Сообщений: 15
17.05.2023, 23:32  [ТС]
Ребята всем привет, не могу найти ошибку.
Вот собственно код
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
program new2;                                                                                                                                                                                                                 
                                                                                                                                                                                                                                
Uses SysUtils,classes;                                                                                                                                                                                                        
var                                                                                                                                                                                                                           
List:TStringList;                                                                                                                                                                                                             
i:integer;                                                                                                                                                                                                                                                                                                                                                                                                                                                  
procedure Scan(PATH:string; var List:TStringList);                                                                                                                                                                            
const                                                                                                                                                                                                                         
Ext = '.txt';                                                                                                                                                                                                                 
Mask = '*';                                                                                                                                                                                                                                                                                                                                                                                                                                         
var                                                                                                                                                                                                                           
DirInfo:TSearchRec;                                                                                                                                                                                                           
begin                                                                                                                                                                                                                         
List:=TStringList.Create;                                                                                                                                                                                                     
    if PATH[Length(PATH)]<>'/' then PATH:=PATH+'/';                       { добовляем слешь к пути}                                                                                                                            
    if FindFirst(PATH + Mask, faAnyfile and faDirectory, DirInfo)= 0 then { проверяем есть ли файлы или папки в каталоге }
       begin                                                                                                                                                                                                                   
       repeat                                                                                                                                                                                                                  
       if ((DirInfo.Attr and faDirectory) = faDirectory) then       { если в директории есть поддиректории }                                                                                                                   
             begin                                                                                                                                                                                                             
             { Фильтруем папки }                                                                                                                                                                                               
             if (DirInfo.Name = 'Dir1')or(DirInfo.Name = 'Dir2')or(DirInfo.Name = 'Dir3')or(DirInfo.Name = 'Dir4')                                                                                           
             or(DirInfo.Name = 'Dir5')or(DirInfo.Name = 'Dir6')or(DirInfo.Name = 'Dit7')or(DirInfo.Name = 'Dir8') then Continue;                                                                                
             if ((DirInfo.Name <>'.') and (DirInfo.Name <>'..')) then                      { и они не равны . и .. }                                                                                                           
             Scan(PATH + DirInfo.Name,List);                                                        { запускаем рекурсию }                                                                                                                 
             end                                                                                                                                                                                                               
             else                                                                                                                                                                                                              
                                                                                                                                                                                                                               
                                                                                                                                                                                                                               
             if (DirInfo.Name = 'tabel.txt')or(DirInfo.Name = 'schet.txt') then  { проверяем есть ли мои txt }                                                                                                         
                                                                                                                                                                                                                               
                                                                                                                                                                                                                              
             if ExtractFileExt(DirInfo.Name) = Ext then   {writeln(PATH + DirInfo.Name);}                                                                                                                                      
 
                         begin                                                                                                                                                                                                 
             List.Add(PATH + DirInfo.Name);   { вот это не работает, добавляет в List.Add только одну найденную строчку }                                                                                                                                                      
                         end;                                                                                                                                                                                                  
             until FindNext(DirInfo)<>0;                                                                                                                                                                                       
                                                                                                                                                                                                                               
       end;                                                                                                                                                                                                                    
                                                                                                                                                                                                                               
FindClose(DirInfo);                                                                                                                                                                                                           
end;                                                                                                                                                                                                                          
                                                                                                                                                                                                                               
begin                                                                                                                                                                                                                         
Scan('/home/oem/Project/Log',List);                                                                                                                                                                                           
for i:=0 to List.Count-1 do                                                                                                                                                                                                   
writeln(List[i]);                                                                                                                                                                                                             
end.
Смысл такой все найденные строчки ( пути к файлам нужно записать в List.Add, но запись происходит только одной строки и все, не могу найти ошибку, помогите пожалуйста.

Добавлено через 34 минуты
До TStringList пробовал значения в массив записывать а потом выводить, та же самая история, записывается только одна строка ( путь) и все((( помогите плиз очень нужно..

Добавлено через 1 час 14 минут
Отвечать не нужно, нашел ошибку.)
0
1 / 1 / 0
Регистрация: 10.04.2023
Сообщений: 15
25.05.2023, 18:24  [ТС]
Всем привет! Ребята может кто даст инфы, хочу сделать проверки в своей программе:
Открылся файл
Существует ли файл
Не равен ли файл 0 байт
Все файлы тхт
Вот у меня такой вопрос, если срабатывает какое то условие при проверке вышеперечисленных пунктов, как сделать так что бы программа не останавливала работу а просто пропускала этот файл ( т.е начинала читать следующий файл) может кто то даст пример кода.
0
 Аватар для mr-Crocodile
3054 / 1673 / 657
Регистрация: 19.03.2019
Сообщений: 5,380
26.05.2023, 09:49
Цитата Сообщение от Mixer124 Посмотреть сообщение
Открылся файл
см.

https://www.freepascal.org/doc... esult.html

https://wiki.freepascal.org/Fi... _In_Pascal

Цитата Сообщение от Mixer124 Посмотреть сообщение
Существует ли файл
FileExists
Pascal
1
if FileExists(ИмяФайла) then ...
Только непонятно, зачем ты существование файла собираешься проверять, если ты все файлы через FindFirst / FindNext находишь. Если поиск вернул тебе имя файла, то какой смысл проверять, существует ли такой файл? Разумеется, существует, раз его поиск нашёл!

Цитата Сообщение от Mixer124 Посмотреть сообщение
Не равен ли файл 0 байт
См. размер файла через FileSize

Цитата Сообщение от Mixer124 Посмотреть сообщение
Все файлы тхт
не понял, что ты под этим подразумеваешь...

Цитата Сообщение от Mixer124 Посмотреть сообщение
Вот у меня такой вопрос, если срабатывает какое то условие при проверке вышеперечисленных пунктов
делаешь проверки, если всё прошло, то обрабатываешь файл, если что-то не то или пошло не так - то условия не выполняются, продолжаешь цикл.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7818 / 4637 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
28.05.2023, 05:14
Цитата Сообщение от mr-Crocodile Посмотреть сообщение
какой смысл проверять, существует ли такой файл? Разумеется, существует, раз его поиск нашёл!
И да, и нет
Поиск его уже нашёл, спору нет. Но...
Существует ли он сейчас (в многозадачном окружении)?
Разумеется, либо ещё существует, либо уже не существует, а также либо доступен для конкретных действий, либо не доступен для них, и, разумеется, всё это не будет иметь никакого значения буквально в следующее мгновение, то есть прямо вот сразу же


Цитата Сообщение от mr-Crocodile Посмотреть сообщение
делаешь проверки, если всё прошло, то обрабатываешь файл, если что-то не то или пошло не так - то условия не выполняются, продолжаешь цикл
Для многозадачной среды всё совсем наоборот
Пытаемся сделать, что хотели; коли возникло исключение, что ж "ну не шмогла". Но в журнал это "не шмогла" записать!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.05.2023, 05:14

Написать процедуру вывода N строк файла
Написать процедуру вывода N строк файла

Написать программу, которая должна включать функции для: - вывода шапки таблицы; - вывода данных одной строки
Написать программу, которая должна включать функции для: - вывода шапки таблицы; - вывода данных одной строки таблицы; - ввода и...

Написать программу для подсчета количества строк текстового файла, начинающихся и оканчивающихся одной и той же литерой
Разработать алгоритм обработки данных, полученных из текстового файла. Написать программу, которая считывает из текстового файла данные и...

Написать программу вывода текстового файла на печать.
Написать программу вывода текстового файла на печать.

Две процедуры или функции для вывода строк из файла
Нужно написать две процедуры или функции что бы выводило количество строк в файле и то что записано в файле вот написал одну процедуру но...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
27
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru