Как отделить буфер от сокета для разных переменных? - PullRequest
0 голосов
/ 19 сентября 2018

Я получаю буфер через соединение с сокетом udp.Код с ++.Вывод выглядит так:

>>375.5,25.3

, где числа разделены запятой и без пробелов.И каждые 100 мс отправляется новый набор чисел.например:

>>375.5,25.3
>>435.6,0.0
>>2500.34,55.2

и т. д.

Я пытаюсь поместить первое число в var1 и второе число в var2 для каждого нового набора.var1 и var2 не являются массивами.Представьте, что мне просто нужно напечатать что-то вроде:

>>var1=375.5
  var2=25.3
>>var1=435.6
  var2=0.0

Вот код, который я использую:

recv_len = recvfrom(s, buff, sizeof(buff), 0, (struct sockaddr *)&si_other, (socklen_t*)&slen);

        if (recv_len== -1)
        {
            printf("Receiving message failed");
            exit(0);
        }
  buff[recv_len] = '\0';


    std::vector<int> vect;

    std::stringstream ss(buff);

    int i;

    while (ss >> i)
    {
        vect.push_back(i);

        if (ss.peek() == ',' || ss.peek() == ' ')
            ss.ignore();
    }

   var1 = vect.at(0);
   var2 = vect.at(1);

   printf("Received packet from %s:%d\nData:%s\n\n",inet_ntoa(si_other.sin_addr),ntohs(si_other.sin_port),buff);

    cout<<var1<<endl;
    cout<<var2<<endl;

вывод, который я получаю, является ошибкой, что-то с размером 1. (извините, я не сохранил вывод этого, чтобы дать точную ошибку вывода. Я отредактирую завтра.) Когда я закомментирую "var2 = vect.at (1)", вывод будет:

>>Received packet from 127.0.0.1:31029
  Data: 375.5,25.3
  375.5
  0

так что это показывает, что мне нужны оба числа, но это не позволит мне разделить их.Я получил разделитель через запятую от этого: Разобрать разделенный запятыми std :: string , но выдает ошибку.

Мне просто нужно отделять буфер каждый раз, когда он входит, как:

>>375.5,25.3

, введите var1 = 375.5 и var2 = 25.3, затем

>>435.6,0.0 

входит, введите var1 = 435.6, введите var2 = 0.0

>>2500.34,55.2

, введите var1 = 2500.34 и var2 = 55.2

и так далее.

--------------------- РЕДАКТИРОВАТЬ ----------------------------

Я получил ошибку, которую не мог вспомнить сверху:

>>Terminate called after throwing an instance of 'std::out_of_range'
  what(): vector::_M_range_check: __n (which is 1) >= this->size() (which is 1)

1 Ответ

0 голосов
/ 19 сентября 2018

Ответ, который вы нашли, работает с целыми числами, а не с числами с плавающей запятой.Во всяком случае, проблему очень легко решить.Если вы уверены в формате вашего буфера (т.е. 2 числа с плавающей запятой, разделенных запятой, без пробелов), решение может выглядеть следующим образом:

char buff[] = "375.5,25.3";
std::string s(buff);
std::cout << std::stof(s.substr(0, s.find(','))) << std::endl;
std::cout << std::stof(s.substr(s.find(',')+1, s.size())) << std::endl;

Вы можете просто использовать substr длясоздайте 2 подстроки: одну перед, другую после запятой, а затем используйте stof для преобразования ее в значение с плавающей запятой.

Если вам нужно что-то более надежное, посмотрите на этот ответ для более полного кода, чтобы разделить строку и перехватить исключения, которые могут быть выданы stof .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...