Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
AlexLan73
2 / 2 / 1
Регистрация: 06.10.2013
Сообщений: 141
#1

Получить строку из буфера - C++

15.10.2016, 13:19. Просмотров 300. Ответов 11
Метки нет (Все метки)

Добрый день.
Помогите пожалуйста, преобразовать строку из буфера

C++
1
2
3
4
5
6
7
8
9
            char data[max_length];
 
            boost::system::error_code error;
            size_t length = sock.read_some(boost::asio::buffer(data), error);
 
            if (error == boost::asio::error::eof)
                break; // Connection closed cleanly by peer.
            else if (error)
                throw boost::system::system_error(error); // Some other error.

С уважением, Александр

Добавлено через 25 минут
Сделал так

C++
1
2
3
4
5
6
7
            char *resultst = new char[length + 1];
            for (size_t k = 0; k < length; k++)
                resultst[k] = data[k];
            resultst[length] = '\0';
 
            string t = resultst;
            delete resultst;
Может можно проще сделать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.10.2016, 13:19
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Получить строку из буфера (C++):

Инвертировать строку без использования буфера - C++
Всем привет. Инвертировать строку с использованием второй строки достаточно просто. А как инвертировать строку без использования...

Получить адрес буфера файла - C++
как получить адрес буфера файла открытого с помощью std::ifstream?

Получить текст из буфера обмена - C++
Итак, проблема в следующем. Я решил написать программу для автоматизации некоторых моих действий Большую часть того что мне было...

Написать функцию, которая считывает из буфера клавиатуры строку в s и возвращает длину строки - C++
*с указателями*- написать функцию которая считывает из буфера клавиатуры строку в s и возвращает длину строки. :scratch:

Записать в файл строку. Скопировать в буфер последние два слова. Вывести содержимое буфера на экран - C++
#include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; int main(){ ofstream fout(&quot;test.txt&quot;); if(!fout) { ...

Не могу получить строку - C++
Здравствуйте, есть программа для перевода строки в Морзянку, но если выполнять считывание с клавиатуры то программа будет считывать только...

11
Invader0x7F
Helper C/C++
281 / 158 / 61
Регистрация: 22.09.2016
Сообщений: 518
Завершенные тесты: 5
15.10.2016, 13:30 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
V1:
C++
1
2
char *resultst = new char[length + 1];
strncpy_s(resultst, length + 1, data, length + 1);
V2: Используя STL:
C++
1
2
3
4
5
#include <string>
 
using std::string;
 
std::string resultst = data;
1
AlexLan73
2 / 2 / 1
Регистрация: 06.10.2013
Сообщений: 141
15.10.2016, 13:36  [ТС] #3
Спасибо)
V1-просто и красиво))
V2- не подойдет, длинна сообщения не известна.
0
Invader0x7F
Helper C/C++
281 / 158 / 61
Регистрация: 22.09.2016
Сообщений: 518
Завершенные тесты: 5
15.10.2016, 13:38 #4
V2- не подойдет, длинна сообщения не известна.
Как раз подойдет в том случае если не известна длина.
0
AlexLan73
2 / 2 / 1
Регистрация: 06.10.2013
Сообщений: 141
15.10.2016, 13:50  [ТС] #5
V1 - выдает ошибку
V2 - создает - все отлично! мусор потом можно обрезать по концу маркера.
0
Убежденный
Ушел с форума
Эксперт С++
15702 / 7212 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
15.10.2016, 16:55 #6
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Invader0x7F Посмотреть сообщение
V2: Используя STL:
C++
1
2
3
4
5
#include <string>
 
using std::string;
 
std::string resultst = data;
А где гарантия, что в data всегда будет завершающий ноль сразу
после данных? Безопаснее так:
C++
1
2
std::string result;
result.append(data, length);
1
Invader0x7F
Helper C/C++
281 / 158 / 61
Регистрация: 22.09.2016
Сообщений: 518
Завершенные тесты: 5
15.10.2016, 16:59 #7
А где гарантия, что в data всегда будет завершающий ноль сразу
после данных?
Специализация перегруженного оператора присвоения для класса std::string, получает в качестве аргумента символьный буфер char* или char[], определяет его размер и копирует его во внутренний буфер реализованный в классе std::string. Ну, и естественно, в конец добавляет '\0'.
0
Убежденный
Ушел с форума
Эксперт С++
15702 / 7212 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
15.10.2016, 17:52 #8
Цитата Сообщение от Invader0x7F Посмотреть сообщение
определяет его размер
Так в том-то и загвоздка, что размер буфера и размер полезных данных - это не одно и то же.
Сделали read_some первый раз, получили строку "12345!@#$%" (12345 - данные,
все остальное - мусор), записали ее в result. Постом снова вызвали read_some,
получили "67890^&*()", добавили это все к result. И в итоге получили в result вот что:

12345!@#$%67890^&*()

а должно было быть

1234567890
0
Invader0x7F
Helper C/C++
281 / 158 / 61
Регистрация: 22.09.2016
Сообщений: 518
Завершенные тесты: 5
15.10.2016, 17:55 #9
возможно. не спорю. в практике хорошего программирования размер этих буферов должен отличаться так:

<размер полезных данных> + 1 = <размер буфера> (размер буфера полезных данных + нуль байт '\0')
0
AlexLan73
2 / 2 / 1
Регистрация: 06.10.2013
Сообщений: 141
15.10.2016, 19:00  [ТС] #10
А почему так может получиться

"получили строку "12345!@#$%" (12345 - данные, все остальное - мусор), записали ее в result. Постом снова вызвали read_some, получили "67890^&*()", добавили это все к result. И в итоге получили в result вот что:

12345!@#$%67890^&*() а должно было быть 1234567890 "

Если буфер заведомо больше передаваемой "посылки"

То есть, в конце передаваемой информации нужно передать контрольную сумму?
0
Убежденный
Ушел с форума
Эксперт С++
15702 / 7212 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
15.10.2016, 22:01 #11
Потому что read_some, как и обычная recv, ничего не знает ни о каких
"посылках" и может вернуть, например, 1 байт за один вызов.
0
AlexLan73
2 / 2 / 1
Регистрация: 06.10.2013
Сообщений: 141
15.10.2016, 22:25  [ТС] #12
Понятно, спасибо)
0
15.10.2016, 22:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.10.2016, 22:25
Привет! Вот еще темы с ответами:

Получить строку состоящую из 5 звёздочек - C++
Почему то программа выводит только одну звёздочку и затем букву &quot;g&quot;. Где тут ошибка? #include &lt;iostream&gt; #include &lt;string&gt; using...

Получить строку на русском языке - C++
Здрасте. Помогите решать проблему. Есть код #include &lt;iostream&gt; // подключаем библиотеку ввода и вывода #include &lt;string&gt;...

Получить строку файла по номеру - C++
Добрый день ,подскажите пожалуйста можно ли с помощью класса fstream получать строку из файла по указанному номеру ? К примеру, ниже код...

Получить строку составляюшую пять звездичек (*) - C++
Получить строку составляюшую пять звездичек (*)


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru