Поиск слов в .txt файле

87
29 июня 2021, 17:20

Суть моей задачи в том , что надо искать определенные лексемы в файлах. Если лексема есть, то выводить значение после него. Допустим лексема = "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;
}
Answer 1

Если нужно записать слово после слова " = ", то попроще:

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. Что вы считаете лексемой, я не знаю, так как каждое выражение можно считать лексемой. Если вы лексемой считаете строку, которую ищете(обычно называют ключом), то данная программа функция ищет по всему файлу это слово, и если оно есть, то пропускает строку "=" и выводит строку после нее. По вашим комментариям вам именно это и нужно, а если нужно другое, то приведите нормальный пример, для которого эта функция не годится, и вам нужно другое. Я вам не смогу помочь, пока вы четко не сформулируете что вам нужно и какие трудности....

Answer 2

Вот Вам вариант решения задачи (кастомный вариант 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

READ ALSO
html css flex-box

html css flex-box

Подскажите как расположить изображения ?

279
Application.Exit() не закрывает приложение

Application.Exit() не закрывает приложение

Есть поток, который выполняется бесконечно:

102