Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.10.2016, 17:38   #1
Nyiann
Новичок
Джуниор
 
Регистрация: 17.09.2015
Сообщений: 2
Печаль Получить текст из файла

Здравствуйте)

Помогите пожалуйста с одним вопросом, Как получить информацию между 2мя словами, у меня есть файл "file.txt"

вот что в файле:

[someInfo]Info[/someInfo]
[someInfo]Infoeqweqweqwe[/someInfo]
[someInfo]Infoeqweqweqweqweqweqweqwe[/someInfo]
[someInfo]Infoeqweqqweqweqweweqwe[/someInfo]
[someInfo]
Infoeqweqweqwe
[/someInfo]
[someInfo]
Infoeqweqweqwesadasdasdasd
[/someInfo]
[someInfo]
Infoe
[/someInfo]


Как мне получить текст между [someInfo] и [/someInfo], при этом текст между ними может быть разной длинны или вообще перенесен на другую строку.


Я понимаю что нужно написать поиск и пока файл не eof() но как мне получить значения? к примеру объявляю переменную

spoisk="[someInfo]";
epoisk="[/someInfo]";

то есть начало и конец чтобы находил и между ними получали текст допустим в переменную gettext; и выводили на экран cout<<gettext;

Можете помочь пожалуйста
Nyiann вне форума Ответить с цитированием
Старый 19.10.2016, 17:57   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Если файл небольшой прочитайте его стрингбуф, например, а потом файндом ищете начало - запоминаете индекс, ищете конец - запоминаете индекс, выделяете подстроку.
p51x на форуме Ответить с цитированием
Старый 19.10.2016, 18:09   #3
Nyiann
Новичок
Джуниор
 
Регистрация: 17.09.2015
Сообщений: 2
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Если файл небольшой прочитайте его стрингбуф, например, а потом файндом ищете начало - запоминаете индекс, ищете конец - запоминаете индекс, выделяете подстроку.
Файл имеет от 5000 строк до 50000

И там может быть не только [someInfo]??????[/someInfo] а еще и другие значения такого же вида, но мне нужно определенные..
Nyiann вне форума Ответить с цитированием
Старый 19.10.2016, 20:17   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

И? Вопрос в чем? Алгоритм я написал. Не будет хватать для очень больших файлов, будем дальше думать...
p51x на форуме Ответить с цитированием
Старый 19.10.2016, 21:24   #5
Максай
Пользователь
 
Аватар для Максай
 
Регистрация: 21.07.2008
Сообщений: 40
По умолчанию

Здравствуйте.
Цитата:
Сообщение от Nyiann Посмотреть сообщение
то есть начало и конец чтобы находил и между ними получали текст допустим в переменную gettext; и выводили на экран cout<<gettext;
Цитата:
Сообщение от Nyiann Посмотреть сообщение
Файл имеет от 5000 строк до 50000

И там может быть не только [someInfo]??????[/someInfo] а еще и другие значения такого же вида, но мне нужно определенные..
Если не считывать весь файл целиком в stringbuf, то можно сделать так:
Код:
#include <cstdlib>
#include <fstream>
#include <iostream>
#include <iterator>
#include <sstream>
#include <string>

int main()
{
    const std::string filename = "myfile.txt";
    const std::string opening_tag = "[someInfo]";
    const std::string closing_tag = "[/someInfo]";

    std::ifstream ifs( filename.c_str() );
    if( ! ifs.is_open() )
    {
        std::cerr << "Error: unable to open file '"
                  << filename << "' for reading." << std::endl;

        return EXIT_FAILURE;
    }
    else
    {
        std::istream_iterator<std::string> it( ifs );
        std::istream_iterator<std::string> eof;
        std::stringstream gettext;
        bool reading_text = false;

        while( it != eof )  // Считываем файл построчно.
        {
            if( reading_text )
            {
                if ( (*it).find( closing_tag ) == std::string::npos )
                {
                    // Продолжаем считывать многострочный текст.
                    gettext << *it;
                }
                else
                {
                    // Найден закрывающий тег, заканчиваем cчитывать многострочный текст.
                    gettext << (*it).substr( 0, (*it).length() - closing_tag.length() );
                    reading_text = false;
                }
            }
            else
            {
                if( (*it).find( opening_tag ) != std::string::npos )
                {
                    const std::string ss( *it, opening_tag.length() );
                    if ( ss.find( closing_tag ) != std::string::npos )
                    {
                        // Открывающий и закрывающий теги находятся на одной строчке.
                        gettext << ss.substr( 0, ss.length() - closing_tag.length() );
                    }
                    else
                    {
                        // Найден открывающий тег, но закрывающего тега в этой
                        // строчке не найдено, начинаем считывать многострочный текст.
                        reading_text = true;
                        gettext << ss << std::endl;
                    }
                }
            }

            if( ! reading_text && ! gettext.str().empty() )
            {
                // Закончено считывание очередного значения,
                // выводим содержимое gettext и сбрасываем его.
                std::cout << gettext.str() << std::endl;
                gettext.str("");
            }

            it++;
        }

        return EXIT_SUCCESS;
    }
}
Программу, конечно, есть куда улучшать: к примеру, она предполагает, что во входном файле нет ошибок, что открывающий тег всегда стоит в начале строки, а закрывающий всегда в конце, что на одной строчке бывает либо один тег, либо пара открывающий/закрывающий, однако в целом идею демонстрирует.

Последний раз редактировалось Максай; 19.10.2016 в 22:05. Причина: Подправил и добавил комментарии
Максай вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получить текст из txt nibufep PHP 6 23.12.2014 19:41
Регулярки, получить текст между Abuhamed PHP 4 28.08.2012 23:55
Получить число как текст capture Microsoft Office Excel 16 02.02.2012 16:04
получить текст сообщения вконтакте Dionix Работа с сетью в Delphi 9 12.07.2010 14:37
Дан файл, содержащий текст, записанный строчными русскими буквами. Получить в др.файле тот же текст, develish151 Microsoft Office Word 4 05.05.2010 13:20