C ++将2d浮点数放入char *

时间:2010-06-07 20:56:09

标签: c++ serialization type-conversion

我正在尝试使用2d浮点数(输入)并将它们放入c ++中的char *(输出)。

void foo(const std::vector<std::vector<float> > &input, char* &output )
{  
   char charBuf[sizeof(output)];
   int counter = 0;
   for(unsigned int i=0; i<input.size(); i++)
   {
      for(unsigned int p=0; p<input.at(i).size(); p++)
      {
         //what the heck goes here
      }
   }

6 个答案:

答案 0 :(得分:2)

您可以在每次迭代时使用std::stringstream将浮动放入std::string,然后从中获取char*数组。如果你想要一个大的char*数组,那么只需使用在循环外定义的单个字符串流。

答案 1 :(得分:1)

这很大程度上取决于你把它们变成一个字母*的意思。

答案 2 :(得分:1)

如果您希望结果是人类可读的,那么您将在snprintf()之后 - 将数字3.1415转换为字符串“3.1415”。如果您只是输出要由另一个程序重新读取的数据,那么您可以将二进制数据转储到输出流中。

请记住,当您输出浮点数的二进制表示时,您必须知道它是如何编码的。如果您在同一平台上阅读和书写,那么编码将是相同的。事实上,大多数桌面平台使用IEEE-754规范来表示浮点数,但检查它是为了安全。

此外,确保您的输出流允许某种版本控制或其他机制,以便稍后在您决定使用它时执行某些操作时修改格式。只是开头的版本号通常就足够了。

答案 3 :(得分:0)

您要做的是称为序列化。 C ++ faq有一个专门用于此的部分:http://www.parashift.com/c++-faq-lite/serialization.html

答案 4 :(得分:0)

以下代码将为您char*参数中的所有float提供input视图。

但是,我非常小心,这实际上就是你想要的。 char *数组不是endian健壮的,我总是尽量避免将分配的指针交给用户。使用此函数的任何人都需要使用output释放delete[],但这对于函数名称或签名(脆弱代码的处方)来说并不明显。

void foo(const std::vector<std::vector<float> > &input, char* &output )
{  
   //this was likely an error, it is always an array of size 4
   //char charBuf[sizeof(output)];

   std::vector<float> tmp_output;

   int counter = 0;  // Why was this here?

   for(unsigned int i=0; i<input.size(); i++)
   {
      // This is slightly more efficient than the hand rolled loop below.
      // std::copy( input[i].begin(), input[i].end(),
      //            std::back_inserter<float>(tmp_output) );

      for(unsigned int p=0; p<input.at(i).size(); p++)
      {
         tmp_output.push_back(input.at(i).at(p));
      }
   }
   output = new char[tmp_output.size()*sizeof(float)];
   std::copy( reinterpret_cast<const char*>(&(*tmp_output.begin())),
              reinterpret_cast<const char*>(&(*tmp_output.end())),
              output );
}

答案 5 :(得分:0)

不要试图将数据放入原始字符数组中,尤其是当您不知道它们的大小时 - 您不在此处。请改用std::string,然后使用std::stringstream写入。{1}}。

无论你做什么,都要摆脱那charBuf件事;你用它做的任何事情都是错误的,因为sizeof(output)不是输出数组的大小。

假设您想要一个人类可读的字符串,您可能需要类似

的字符串
std::string foo(const std::vector<std::vector<float> > &input)
{
    std::ostringstream stream;
    for (std::size_t i = 0; i < input.size(); ++i)
    {
        if (i != 0) stream << "\n";
        for (std::size_t j = 0; j < input[i].size(); ++j)
        {
            if (j != 0) stream << ",";
            stream << input[i][j];
        }
    }

    return stream.str();
}