Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Построчное чтение буффера в потоке - инкапсуляция / 3 сообщений из 3, страница 1 из 1
10.11.2017, 08:57
    #39550664
привет АХД
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построчное чтение буффера в потоке - инкапсуляция
Написал тестовый примерчик построчного чтения буффера.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
struct membuffer : std::streambuf
{
    membuffer(char* begin, char* end) {
        this->setg(begin, begin, end);
    }
};

void Test()
{
    // Имитирую получение динамического буффера
    char const_line[] = "It is a test message\nwith few lines\r\nfor testing";    
    auto size = sizeof(const_line);
    char* buffer = new char[size];
    memcpy(buffer, const_line, size);

    // Перевожу в std::istream
    membuffer sbuf(buffer, buffer + size);
    std::istream in(&sbuf); 
    std::string line;
    
    // Читаю построчно
    while (std::getline(in, line)) {
        std::cout << line << "\n";
    };    

    // Освобождаю память, выделенную под буффер
    delete[] buffer;
}

Работает как и ожидалось
Код: plsql
1.
2.
3.
It is a test message
with few lines
for testing


Теперь хочу выставить это как API, по возожности максимально инкапсулировав внутри работу потоками. Чтобы для вызывающего это выглядело так.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
// Открытие потока, где mystream - некий составной объект, видимо содержащий информацию о потоке и адрес буффера
auto mystream = Open(...);
// Построчное чтение в цикле
while(..) 
{

}
// Закрытие буффера и потока
Close(mystream);


Пытаюсь сделать тестовый пример (в реальности же буффер может быть получен из разных источников). OpenBufferForRead - функция, которая получает поток, Test2 - ф-ия, которая его читает. Если от объявления std::istream в вызывающей функции Test2 не уйти, то потом могу обернуть это свой класс или заменить своим именем типа посредством typedef.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
char* OpenBufferForRead(std::istream &in)
{
    // Имитирую получение динамического буффера
    char const_line[] = "It'' s test message\nwith few lines\r\nfor testing";
    auto size = sizeof(const_line);
    char* buffer = new char[size];
    memcpy(buffer, const_line, size);
    
    // Перевожу в std::istream
    membuffer sbuf(buffer, buffer + size);
    
    in = std::istream(&sbuf);

    return buffer;
}

void Test2()
{
    std::istream in;
    std::string line;
    
    // Передать стрим по ссылке, а так же получить указатель на буффер, чтобы потом освободить память
    auto buffer = OpenBufferForRead(in);

    // Читаю построчно
    while (std::getline(in, line)) {
        std::cout << line << "\n";
    };

    delete[] buffer;
}


Компилятор (Visual Studio 2013) ругается на выделенные желтым строки. Перечислю ошибки в хронологическом порядке.

Код: plaintext
1.
2.
3.
4.
5.
Ошибка	1	error C2248: std::basic_istream<char,std::char_traits<char>>::operator =: 
невозможно обратиться к protected член, объявленному в классе "std::basic_istream<char,std::char_traits<char>>"	

Ошибка	2	error C2512: std::basic_istream<char,std::char_traits<char>>: 
нет подходящего конструктора по умолчанию	


Даже если бы и скомпилилось, не понятно, как бы повел себя membuffer после выхода из ф-и OpenBufferForRead - не очистит ли содержимое буффера.

Подскажите, в какую строну копать для решения моей задачи.
...
Рейтинг: 0 / 0
11.11.2017, 23:28
    #39551614
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построчное чтение буффера в потоке - инкапсуляция
привет АХДПодскажите, в какую строну копать для решения моей задачи.
а) в сторону учебника
б) в сторону закопанного мозга

выбирай.

когда ты создаешь объект или ссылку (стрелку), надо понимать - что именно он должен содержать, по твоему
...
Рейтинг: 0 / 0
19.11.2017, 11:04
    #39555631
привет АХД
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построчное чтение буффера в потоке - инкапсуляция
Siemarglа) в сторону учебникаХорошо, пойду читать Страуструпа.Siemarglпо твоемуА ты почитай Розенталя.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Построчное чтение буффера в потоке - инкапсуляция / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]