我正在尝试使用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
}
}
答案 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();
}