n
March 4, 2019, 1:07 p.m.

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

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% refund of hotel reservation amount on Booking
10% refund of hotel reservation amount on Booking
We offer a link with a 10% return on the amount of the order when booking a hotel through 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

Comments

Only authorized users can post comments.
Please, Log in or Sign up
MB
July 14, 2019, 5:57 p.m.
Maksim Belikov

C++ - Test 005. Structures and Classes

  • Result:100points,
  • Rating points10
MB
July 14, 2019, 5:52 p.m.
Maksim Belikov

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:90points,
  • Rating points8
MB
July 14, 2019, 5:45 p.m.
Maksim Belikov

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

  • Result:71points,
  • Rating points1
Last comments
July 16, 2019, 3:15 p.m.
Evgenij Legotskoj

Конечно )) На самом деле не все читали Шлее... я например не читал ))
July 16, 2019, 3:05 p.m.
IscanderChe

Так пример с QLocalServer и QLocalSocket я целиком переписал с QTcpSocket и QTcpServer из книги Шлее. Принципиальное отличие - где коннект ставить. :)) Разве что на это упор сделать. Но я могу...
July 16, 2019, 2:47 p.m.
Evgenij Legotskoj

Лучше API ))) Кстати, по использованию QLocalServer и QLocalSocket на сайте нет статей, было бы очень полезно и хорошо пошло бы в раздел Qt.
July 16, 2019, 12:36 p.m.
IscanderChe

Да, прямой доступ не предполагается. Впрочем, можно, конечно, и напрямую. Всё равно всё локально происходит. Проблема в том, как донести сведения об изменениях в базе, которые вносит клиент, д...
b
July 16, 2019, 8:38 a.m.
bbb116

спасибо, до smart pointer еще не дошел )
Now discuss on the forum
July 17, 2019, 11:49 a.m.
Mihailll

В настройкак указан индификатор проекта и ключ. Осталось понять как использовать ключ. Попробовал вставить в этот запрос 'https://[PROJECT_ID].firebaseio/users/jack/name.json?access_to...
b
July 17, 2019, 9:01 a.m.
bbb116

Вообщем работает только если делать setSceneRect только в конструкторе главного окна, если потом менять rect например при вставке картинки то появляются сколлы все как надо только области не р...
July 17, 2019, 5:54 a.m.
Aleksej Vnukov

хочу не стандартный набор символов, а все ненужное убрать чтоб не мешало. для начала решил посмотреть как работает клава на родном примере, а он на телефоне не взлетел вот и начал разби...
July 17, 2019, 5:06 a.m.
Mihailll

Добрый день.Возможно вы сталкивались с облаками.Нужно из Qt создавать на облаке папки, записывать в папки файлы, читать и удалять с компьютера файлы.Возможно знаете, что лучше и проще испол...
Looking for a Job?
25,000.00 руб. - 30,000.00 руб.
Разработчик Qt/C++
Barnaul, Altai Krai, Russia

For registered users on the site there is a minimum amount of advertising

EVILEG
About
Services
Join us
© EVILEG 2015-2019
Recommend hosting TIMEWEB