n
4 марта 2019 г. 18: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();

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

Возврат 10% от суммы заказа отеля на Booking
Возврат 10% от суммы заказа отеля на Booking
Предлагаем ссылку с 10% возвратом от суммы заказа при бронировании отеля через Booking
12

Добрый день!

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

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

0
n

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

0

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

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

#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;
}
0
n

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

0
n

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

#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;
}
0
n

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

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

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

found=content.find('.');

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

0

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

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

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

0
n

пример прост: я пишу из консоли переменную 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;
}
0

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

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

#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;
}

0
n

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

0

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

#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;
}

0
n

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

0

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
s
26 мая 2019 г. 14:33
simpleunderground

Qt - Тест 001. Сигналы и слоты

  • Результат:31баллов,
  • Очки рейтинга-10
НД
25 мая 2019 г. 23:25
Николай Демиденко

C++ - Тест 003. Условия и циклы

  • Результат:64баллов,
  • Очки рейтинга-1
НД
25 мая 2019 г. 23:19
Николай Демиденко

C++ - Тест 002. Константы

  • Результат:50баллов,
  • Очки рейтинга-4
Последние комментарии
21 мая 2019 г. 20:10
Дмитрий

Приветствую! Я думаю дойдёт и до этого, но пока изучать его у меня нет желания.
20 мая 2019 г. 19:20
Евгений Легоцкой

Добрый день! Вы не думали разместить репозиторий проекта на GitHub?
P.
18 мая 2019 г. 14:03
PELMYACH .

Спасибо большое! Вскоре буду разбираться!
18 мая 2019 г. 9:13
Евгений Легоцкой

Добрый день! Отнимать значение общего счётчика можно в деструкторе класса кнопки QDynamicButton::~QDynamicButton(){ ResID--;} При этом я бы ещё переустанавливал значения вс...
P.
14 мая 2019 г. 22:33
PELMYACH .

Здравствуйте!А не подскажите, как можно при удалении какой либо кнопки, у щётчика отнять значение?Дабы например четвёртой кнопке соответствовал ID 4, а не 5 скажем
Сейчас обсуждают на форуме
26 мая 2019 г. 6:49
Михаиллл

Скачал dll от сюда и заработало
24 мая 2019 г. 6:48
Евгений Легоцкой

Если там будут только перечисления внутри namespace, то жа, достаточно будет заголовочного файла
24 мая 2019 г. 6:28
Андрей Янкович

работает любой http сервер, и можно использовать обсалютно любой портпример <RemoteRepositories> <Repository> <Url>http://178.124.160.6:3030/A/B&l...;
23 мая 2019 г. 10:42
Михаиллл

Спасибо, помогло.
23 мая 2019 г. 6:31
Евгений Легоцкой

Для задач и граф-то не нужен. Достаточно будет таблицы в локальной базе данных SQLite, в которой указывается задача, время и т.д. В этом разделе есть примеры по работа с базой д...

Для зарегистрированных пользователей на сайте присутствует минимальное количество рекламы

EVILEG
О нас
Услуги
Присоединяйтесь к нам
© EVILEG 2015-2019
Рекомендует хостинг TIMEWEB