Консультация № 171149
08.08.2009, 04:05
0.00 руб.
0 2 1
Здравствуйте,
есть тектовый файл в котором находится текст вида как указанно в приложении.Мне нужно найти в тексте строки вида
( Name ) : text text1 text2
и записать эти строки в отдельный текстовый файл.
Мне не ясно как можно осуществить сам поиск.Попробовал использовать

fscanf(file2,"( %s ) :%s %s %s",&text,text1,text2);

если 1 строчка, то записывает как надо, а если поиск по тексту вести, то ничего не находит.
Тоесть после поиска по данному тексту в конечном txt должно получиться:
( Server ) : Mode is already active
( Server2 ) : Test Mode is already active

Приложение:
Hello
You have 1 warning
Last Update: Небольшие исправления.
( Server ) : Mode is already active
This is a test mode
( Server2 ) : Test Mode is already active
Errors: 0
Warnings: 1
Server shutting down

Обсуждение

Неизвестный
08.08.2009, 05:19
общий
Александр Большаков:
Попробуйте в консоли такую команду:

findstr /B /R /C:"( .* ) : .*" input.txt > filtered.txt

Может, и не стоит решать это на С. А в данном случае вообще достаточно, чтобы строка начиналась с символа '('. Если только нет еще каких-то похожих строк.
А в Линукс-форуме за попытку фильтрации лога без grep расстреляли бы ;)
Неизвестный
08.08.2009, 05:44
общий
это ответ
Здравствуйте, Александр Большаков.
Можно решить это используя регулярные выражения.
MS Visual Studio 2008
Код:

#include <iostream>
#include <regex>
#include <fstream>
#include <string>

using namespace std;

// Это пространство имен поддерживается не всеми компиляторами
using namespace std::tr1;

int main()
{
// Файлы
ifstream in("input.txt");
ofstream out("output.txt");
// Регулярное выражение для поиска подстроки вида "( СЛОВО ) :"
// Регулярное выражение можете модифицировать так как Вам необходимо
regex reg_expr("^\\(\\s\\w+\\s\\)\\s:");
string str;
size_t count=0;
while(!in.eof())
{
getline(in,str);
if(regex_search(str,reg_expr))
{
out<<str<<endl;
++count;
}
}
cout<<"Found "<<count<<" lines"<<endl;
system("PAUSE");
return 0;
}
Форма ответа