Суть моей задачи в том , что надо искать определенные лексемы в файлах. Если лексема есть, то выводить значение после него. Допустим лексема = "hello"; В текстовом файле, она записана так: hello = world
. Мне надо вывести только world.
Мне не удаётся сделать второй этап - вывод.
#include <iostream>
#include <string>
#include <fstream>
#include <cstdlib>
using namespace std;
void checkfile( string search)
{
ifstream fin;
string line;
size_t pos;
fin.open("file.txt");
if(!fin)
{
cout << "Файл не может быть открыт!" << endl;
exit(1);
}
while(fin.good())
{
getline(fin,line);
pos=line.find(search);
if(pos!=string::npos)
{
/*
for(int i = search.size()+1;i<temp.size();i++)
cout << temp[i];
Пробовал так, но выводит только если необходимо одну лексему искать.
*/
cout << line << endl;
break;
}
}
}
int main()
{
const string word = "hello";
checkfile(word);
return 0;
}
Если нужно записать слово после слова " = ", то попроще:
void
checkfile(const std::string& search, std::ifstream& fin)
{
using In = std::istream_iterator<std::string>;
auto pos = std::find(In(fin), In(), search);
if (pos != In())
std::cout << *(++++pos);
else
std::cout << "нет такого слова";
fin.close();
}
Хотя лучше возвращать из функции эту строку, а пользователь пусть сам решает что делать.
P.S. Что вы считаете лексемой, я не знаю, так как каждое выражение можно считать лексемой. Если вы лексемой считаете строку, которую ищете(обычно называют ключом), то данная программа функция ищет по всему файлу это слово, и если оно есть, то пропускает строку "=" и выводит строку после нее. По вашим комментариям вам именно это и нужно, а если нужно другое, то приведите нормальный пример, для которого эта функция не годится, и вам нужно другое. Я вам не смогу помочь, пока вы четко не сформулируете что вам нужно и какие трудности....
Вот Вам вариант решения задачи (кастомный вариант grep'a) необходимо поменять только паттерн поиска
static std::vector<std::pair<std::size_t, std::string>>
matchec_rgs(const std::filesystem::path& pth, const std::regex& re) {
std::vector<std::pair<std::size_t, std::string>> v;
std::ifstream ist{pth.c_str()};
std::string s;
for(std::size_t line{1}; std::getline(ist, s); ++line) {
if(std::regex_search(std::begin(s), std::end(s), re)) {
v.emplace_back(line, std::move(s));
}
}
return v;
}
void __attribute__((noinline))
castom_grep(int argc, char *argv[]) noexcept {
std::regex pattern;
try {
pattern = std::regex{"ert234"};
} catch (const std::regex_error& err) {
std::cerr << err.what() << std::endl;
return;
}
// итерация по файловой системе
for (const auto& entry
: std::filesystem::recursive_directory_iterator(std::filesystem::current_path())) {
auto ms{matchec_rgs(entry.path(), pattern)};
for (const auto& [number, content] : ms) {
std::cout << entry.path().c_str()
<< ":"
<< number
<< " - "
<< content
<< std::endl;
}
}
}
В любом случае при решении задач очень похожих на на стандартные средства gnu/linux win32 или других - стоит не пилить велосипед а посмотреть исходники(в случае Linux)
вот ссылка на grep https://github.com/c9/node-gnu-tools/tree/master/grep-src
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab