Форум программистов, компьютерный форум CyberForum.ru

Обрезка заданной строки в файле с обеих сторон - C++

Восстановить пароль Регистрация
 
Afftarius
0 / 0 / 0
Регистрация: 10.08.2014
Сообщений: 4
10.08.2014, 18:49     Обрезка заданной строки в файле с обеих сторон #1
Добрый день. Нужно обрезать текстовый файл, при этом известен текст слева и справа от нужного, но не сам нужный.
C++
1
2
3
4
5
6
7
string input;
string start = "<div data-lobc=\"0\" id=\"", finish = "\" class=\"pm_thread new";
ifstream f("file.txt");
getline(f, input); // Читаем весь файл целиком
input.erase(0, input.find(start) + start.length()); // Стираем все от начала до начального слова + само начальное слово
input.erase(input.find(finish) - 1, input.length()); //стираем все после конечного слова с конечным словом
f.close();
При выполнении предпоследней строчки валится с "Необработанное исключение в "0x764042eb" в "ip.exe": Исключение Microsoft C++: std::out_of_range по адресу 0x0028f4a8.."
Файл весит 18 килобайт, если его усечь до одной строчки, ошибок нет.
visual studio 2008
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.08.2014, 18:49     Обрезка заданной строки в файле с обеих сторон
Посмотрите здесь:

Если в обеих векторах есть элементы, кратные 4, то сформировать вектор С из положительных элементов обеих векторов C++
составить процедуру в результате которой из первой заданной строки будет удалятся каждый символ принадлежащий и второй заданной строке C++
C++ Поиск в файле заданной последовательности символов
Строки, динамическая память, обрезка строк C++
Поиск заданной последовательности символов в бинарном файле C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
10.08.2014, 19:06     Обрезка заданной строки в файле с обеих сторон #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
ты читаешь только одну строку из файла. Целиком например так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <fstream>
#include <string>
 
int main()
{
    std::ifstream ifs("in.txt");
    if(ifs.is_open())
    {
        std::string str;
        for(char c; ifs.get(c); str += c)
            ;
        std::cout << str << '\n';
    }
    else
        std::cerr << "Unable to open input file\n";
    return 0;
}
Afftarius
0 / 0 / 0
Регистрация: 10.08.2014
Сообщений: 4
12.08.2014, 06:10  [ТС]     Обрезка заданной строки в файле с обеих сторон #3
Спасибо, все работает

Добавлено через 19 часов 7 минут
но теперь еще такой вопрос... стоит setlocale(0, ""); если вывести русский текст через cout, то он отображается нормально. Но если его читать из файла (UTF-8), получаются кракозябры
пробовал пересохранять в ANSI, но fstream меняет на UTF-8 сам
есть решение для этого?
скрин во вложениях
Миниатюры
Обрезка заданной строки в файле с обеих сторон  
Afftarius
0 / 0 / 0
Регистрация: 10.08.2014
Сообщений: 4
12.08.2014, 06:18  [ТС]     Обрезка заданной строки в файле с обеих сторон #4
читаю вот таким:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
ifstream hist("history.txt");
                    string line;
                    ofstream output("messages_only.txt");
 
                    while (getline(hist, line))
                    {
                        size_t pos = line.find("<div class=\"msg_body\">");
                        if (pos != string::npos)
                        {
                            line.erase(0, 34);
                            line.erase(line.length()  - 6);
                            output << nick << br;
                            output << line;
                            output << br;
                            cout << endl << line << endl << endl;
                        }
                        else 
                        {
                            line = "";
                            output << line;
                        }
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
12.08.2014, 09:35     Обрезка заданной строки в файле с обеих сторон #5
Afftarius, можете вместо erase'ов воспользоваться выделением субстроки. По крайней мере это избавит вас от переносов символов:
C++
1
2
input = input.substr(input.find(start) + start.length(),                           //Начало субстроки
                     input.find(finish) - input.find(start) + start.length()); //Количество элементов в субстроке
Ах да с диапазонами мог напутать. Проверьте.
Afftarius
0 / 0 / 0
Регистрация: 10.08.2014
Сообщений: 4
12.08.2014, 09:58  [ТС]     Обрезка заданной строки в файле с обеих сторон #6
Ilot, спасибо, мне бы теперь разобраться с кодировкой.
Yandex
Объявления
12.08.2014, 09:58     Обрезка заданной строки в файле с обеих сторон
Ответ Создать тему
Опции темы

Текущее время: 15:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru