n
newbie.works.with.QT04 березня 2019 р. 13:07

как найти конкретную строку в файле (блокнот)

c++

У меня следуйщая задача:

ввожу слово или код в консоль, программка считывает, находит в блокноте нужную строку записывает две переменные:
(1-я ту строку которую мы нашли благодоря слову или коду и
2-я следуйщая сторка после неё)
вот так вот.

у меня есть только проверка есть ли слово или код:

#include <iostream>
#include <windows.h>
#include <string.h>
#include <fstream>

using namespace std;

int main()
{
    char word[256], line[256], tmp[256];
    char *buf = NULL;
    ifstream file;
    setlocale(0, "");
    cout << "слово для поиска: ";
    cin.get(word, 256, '\n');

    file.open("D:\\TRAN\\Lib6.txt", ios::in);
    if(!file)
          {
          cout<<"нет такого файла!!!!"<<endl;
                       exit(1);
 }
    while (!file.eof())
    {
        file.getline(line, 256, '\n');
        strcpy(tmp, line);
        buf = strtok(tmp, " ");

        if (buf == NULL)
        {
            cout << "Ошибка" << endl;
                       file.close();
                       system("pause");
            exit(1);
          }
        if (strcmp(buf, word) == 0)
        {
            cout << line <<" : найдено совпадение" << endl;

            system("pause");
            exit(0);

        }

    }
    cout << "нет подобных значений" << endl;
    file.close();
    system("pause");
    return 0;
}

и просто вывод текста:

 const int len = 300, strings = 6;
    const char ch = '\n';
    char mass[len][strings];

    ifstream fs("D:\\TRAN\\Lib6.txt", ios::in | ios::binary); 

    if(!fs) return 1; 

    for(int r = 0; r<strings; r++)
    {
        fs.getline(mass[r], len-1,ch); 
        cout << "String " << r+1 << " = "<< mass[r] << endl; 
    }
    fs.close();

а вот найти строку по слову, записать в переменную
эту строку и в другую переменную следуйщую строку не знаю как...
кажется двигаюсь не в том направлении :(
помогите пожалуйста.

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

Вам це подобається? Поділіться в соціальних мережах!

12
Evgenii Legotckoi
  • 05 березня 2019 р. 03:38

Добрый день!

Вы не пробовали использовать std::string для строк?

Это было бы несколько проще для поиска строк, вот примеры для поиска строк в строке std::string

    n
    • 07 березня 2019 р. 13:37

    Добрый вечер,
    спасибо за ссылку. А для работы нужно весь текст из txt записывать? не получается организовать чтение из файла (не знаю как это сделать)

      Evgenii Legotckoi
      • 08 березня 2019 р. 03:37

      конечно, нужно считывать

      Вот например один из вариантов чтения из файла в одну строку

      #include <fstream>
      #include <string>
      
      int main(int argc, char** argv)
      {
        std::ifstream ifs("myfile.txt");
        std::string content((std::istreambuf_iterator<char>(ifs)), (std::istreambuf_iterator<char>()));
        return 0;
      }
      
        n
        • 09 березня 2019 р. 07:31

        Большое спасибо!!!!
        Только один вопрос: как записать в переменную всю строку сначала (у меня просто получается только кусок) и как записать следуйщую строку?

          n
          • 09 березня 2019 р. 07:36

          Вот у меня так получилось:

          #include <fstream>
          #include <string>
          #include <iostream> 
          
          int main(int argc, char** argv)
          {
            setlocale(LC_ALL, "Russian");
          
            std::ifstream ifs("D:\\TRAN\\Lib6.txt");
          
            std::string content((std::istreambuf_iterator<char>(ifs)), (std::istreambuf_iterator<char>()));
            std::string str2 ("Seven");
          
            std::size_t found = content.find(str2);
            if (found!=std::string::npos)
              std::cout << "ïåðâàÿ «èãëà» íàéäåíà â: " << found << "                found 1" << '\n';
          
          
          
          
          
              found=content.find('.');
            if (found!=std::string::npos)
              std::cout << "Ïåðèîä íàéäåí ïî àäðåñó: " << found<< "                found 4" << '\n';
          
          
              content.replace(content.find(str2),str2.length(),"ðàçäåë");
            std::cout << content << '\n';
          
            return 0;
          }
          
            n
            • 09 березня 2019 р. 08:35

            Мысли насчёт второй строчки таковы:

             std::string str2 ("\n");
            

            узнать где переход на следуйщую строку и узнать точку

            found=content.find('.');
            

            и записать всё что между ними в переменную (только это в мыслях, а как скомпилировать так ошибки одни)

              Evgenii Legotckoi
              • 10 березня 2019 р. 05:52

              Что это за кракозябры в коде. Как вообще понять, что вы этим хотите сказать?

              У себя код скомпилировал, ну в некоторых случаях там есть выход за пределы массива, если не находит тот же самый Seven.

              Не совсем понимаю конкретики вашей проблемы. И ещё перепишите код с использованием фигурных скобок у условий. А то мне кажется, что вы просто не совсем понимаете синтаксис языка. Если фигурный скобок у if нет, то в C++ учитывается в качестве тела условия только одна следующая за if строка, и никакие отступы в данном языке программирования роли не играют.

                n
                • 10 березня 2019 р. 08:21

                пример прост: я пишу из консоли переменную string
                -Chto chitaesh?

                txt:

                Privet, kak dela?
                horosho.
                Chto chitaesh?
                knigy.
                interesnaia?
                net, no mogy dat pochitat.
                
                

                программа должна выдать:
                -knigy.

                непонимаю как сказать программе
                - все символы после конца строки и до точки запиши в пременную dva

                #include <fstream>
                #include <string>
                #include <iostream> 
                
                int main(int argc, char** argv)
                { 
                   //dva;
                  setlocale(LC_ALL, "Russian");
                
                  std::ifstream ifs("D:\\TRAN\\Lib6.txt");
                
                  std::string content((std::istreambuf_iterator<char>(ifs)), (std::istreambuf_iterator<char>()));
                  std::string str2 ("Chto chitaesh?");
                
                  std::cout << str2.size() << std::endl;
                
                  std::size_t found = content.find(str2);
                  if (found!=std::string::npos){
                        std::cout << "конец слова " << found+str2.size() <<  '\n';
                  }
                
                
                
                  std::string str2 ("'\n'");
                  // нужно чтобы поиск был после ((found+str2.size()
                  std::cout << str2.size() << std::endl;
                
                  std::size_t found = content.find(str2);
                  if (found!=std::string::npos){
                        std::cout << "Наша строка " << found+str2.size() <<  '\n';
                  }
                
                
                    found=content.find('.');
                  if (found!=std::string::npos){
                     std::cout << "Нужно указать чтобы точка искалась после  (found+str2.size()   " << found<<  '\n';
                  }
                   //и все символы после ((found+str2.size()  и до точки записать в переменную dva
                
                
                  std::cout << content << '\n';
                
                  return 0;
                }
                
                  Evgenii Legotckoi
                  • 11 березня 2019 р. 04:30

                  Ну вот так можно написать программу.

                  Сохранит в вектор все строки, которые оканчиваются на точку. В вашем случае это как раз ответы получаются.

                  #include <iostream>
                  #include <string>
                  #include <fstream>
                  #include <vector>
                  
                  bool endsWith(const std::string& s, const std::string& suffix)
                  {
                      return s.rfind(suffix) == (s.size()-suffix.size());
                  }
                  
                  int main()
                  {
                      std::ifstream file("D://text.txt");
                  
                      std::vector<std::string> answers;
                  
                      std::string str;
                      while (std::getline(file, str))
                      {
                          if (endsWith(str, "."))
                          {
                              answers.push_back(str);
                          }
                      }
                  
                      for (const std::string& answer : answers)
                      {
                          std::cout << answer << std::endl;
                      }
                  
                      return 0;
                  }
                  
                  
                    n
                    • 11 березня 2019 р. 11:42

                    Добрый вечер. Извините, неправильно написал.....
                    Ну так выводит все строки с точкой, а мне нужно только следуйщую после нашей.

                      Evgenii Legotckoi
                      • 11 березня 2019 р. 15:47
                      • (відредаговано)
                      • Відповідь була позначена як рішення.

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

                      #include <iostream>
                      #include <string>
                      #include <fstream>
                      #include <vector>
                      
                      bool endsWith(const std::string& s, const std::string& suffix)
                      {
                          return s.rfind(suffix) == (s.size()-suffix.size());
                      }
                      
                      int main()
                      {
                          std::ifstream file("/home/dekadent/text.txt");
                          std::string questionStr = "Chto chitaesh?";
                          std::string str;
                      
                          bool found = false;
                          while (std::getline(file, str))
                          {
                              if (str == questionStr)
                              {
                                  while (std::getline(file, str))
                                  {
                                      if (endsWith(str, "."))
                                      {
                                          found = true;
                                          break;
                                      }
                                  }
                              }
                      
                              if (found)
                              {
                                  break;
                              }
                          }
                      
                          std::cout << str << std::endl;
                      
                          return 0;
                      }
                      
                      
                        n
                        • 12 березня 2019 р. 12:57

                        Большооооое спасибо!!!!!
                        Не передать как я вам благодарен, спасибо что всегда отзываетесь.
                        Теперь я смогу продолжить работу в QT!!! (пробую писать бота (Я как вы могли догадаться немного не програмист, моя специализация - анимация),
                        ( с Ui разобрался (строка ввода с кнопочкой), а вот с блокнотом была проблема, но благодоря вам это уже в прошлом (в эти строчки будут закидываться не просто слова, а путь к Waw файлу))
                        Спасибо!!!!

                          Коментарі

                          Only authorized users can post comments.
                          Please, Log in or Sign up
                          AD

                          C++ - Тест 004. Указатели, Массивы и Циклы

                          • Результат:50бали,
                          • Рейтинг балів-4
                          m
                          • molni99
                          • 26 жовтня 2024 р. 01:37

                          C++ - Тест 004. Указатели, Массивы и Циклы

                          • Результат:80бали,
                          • Рейтинг балів4
                          m
                          • molni99
                          • 26 жовтня 2024 р. 01:29

                          C++ - Тест 004. Указатели, Массивы и Циклы

                          • Результат:20бали,
                          • Рейтинг балів-10
                          Останні коментарі
                          ИМ
                          Игорь Максимов22 листопада 2024 р. 11:51
                          Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                          Evgenii Legotckoi
                          Evgenii Legotckoi31 жовтня 2024 р. 14:37
                          Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                          A
                          ALO1ZE19 жовтня 2024 р. 08:19
                          Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                          ИМ
                          Игорь Максимов05 жовтня 2024 р. 07:51
                          Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                          d
                          dblas505 липня 2024 р. 11:02
                          QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                          Тепер обговоріть на форумі
                          Evgenii Legotckoi
                          Evgenii Legotckoi24 червня 2024 р. 15:11
                          добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                          t
                          tonypeachey115 листопада 2024 р. 06:04
                          google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
                          NSProject
                          NSProject04 червня 2022 р. 03:49
                          Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
                          9
                          9Anonim25 жовтня 2024 р. 09:10
                          Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

                          Слідкуйте за нами в соціальних мережах