powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Построчное чтение буффера в потоке - инкапсуляция
3 сообщений из 3, страница 1 из 1
Построчное чтение буффера в потоке - инкапсуляция
    #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
Построчное чтение буффера в потоке - инкапсуляция
    #39551614
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
привет АХДПодскажите, в какую строну копать для решения моей задачи.
а) в сторону учебника
б) в сторону закопанного мозга

выбирай.

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


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