在我的项目中,我需要使用以下库(OMPL)。我特别感兴趣的是一个成员函数printAsMatrix(std::ofstream&out),它将数据输出到终端或文件。这里的函数是:
void ompl::geometric::PathGeometric::printAsMatrix(std::ostream &out) const
{
const base::StateSpace* space(si_->getStateSpace().get());
std::vector<double> reals;
for (unsigned int i = 0 ; i < states_.size() ; ++i)
{
space->copyToReals(reals, states_[i]);
std::copy(reals.begin(), reals.end(), std::ostream_iterator<double>(out, " "));
out << std::endl;
}
out << std::endl;
}
但我需要这些输出的值在其原始形式,作为双倍。因此,我想通过ifStringStream
库阅读它们,使用我自己实现的以下函数:
std::ofstream solution_matrix;
pg->printAsMatrix( solution_matrix ); // generate the solution with OMPL and copy them into "solution_matrix"
std::istringstream istr; // generate a variable
std::string buffer; // the buffer in which the string is going to be copied t
double var1, var2; // dummies variables
while( getline( solution_matrix, buffer ) ) {
istr.str( buffer );
istr >> var1 >> var2 >> var3 >> var4 >> var5 >> var6 >> var7;
std::cout >> var1 >> var2; // did you copy all data!?!? Show me please!
}
由于getline
函数只接受std::ifstream数据,我得到了很多编译错误。
所以我做了一个临时的变通办法:
>
创建了新的IFStream
变量:
STD::IFSTREAM输入矩阵;
尝试将输出的矩阵复制到输入:
solution_matrix< 使用新变量调用getline函数: getline(input_matrix,buffer); 我现在没有编译错误,但代码根本不工作。而且我也不确定我做的是否正确。 环顾四周,我发现了许多示例,首先使用文件复制数据,然后使用 但要做到这一点,我需要创建一个新文件,将其保存在硬盘上,然后使用 这种方式可以工作,但我真的不想创建一个文件。有没有办法做到: 很多人提前道谢ifstream
读取同一文件。类似于: // Print the solution path to a file
std::ofstream ofs("path.dat");
pg->printAsMatrix(ofs);
ifstream
再次打开它:std::ifstream file;
file.open( "path.dat" );
您可以将std::StringStream
与std::GetLine
一起使用,它可以作为oStream
参数传递给您的函数。例如:
std::stringstream solution_matrix;
pg->printAsMatrix( solution_matrix );
std::string line;
while (std::getline(solution_matrix, line)) {
std::cout << line << std::endl;
}
此外,您的<<
在您的cout语句中是错误的:
std::cout >> var1 >> var2;
应该是:
std::cout << var1 << var2;
编辑
为了澄清这一点,这里有一个完整的例子来说明它的工作:
#include <algorithm>
#include <iostream>
#include <iterator>
#include <sstream>
#include <fstream>
#include <vector>
#include <string>
void func(std::ostream&, const std::vector<double>&);
int main(int argc, char *argv[])
{
std::stringstream solution_matrix;
std::vector<double> example;
for (int i=0; i<10; ++i) {
example.push_back(i);
}
func(solution_matrix, example);
std::string line;
while (std::getline(solution_matrix, line)) {
std::cout << line << std::endl;
}
}
void func(std::ostream& out, const std::vector<double>& data)
{
std::copy(data.begin(), data.end(), std::ostream_iterator<double>(out, "\n"));
}
这里的func
与您的printasMatrix()
函数类似,因为它写入OStream。向量example
包含值0-9。输出为:
0
1
2
3
4
5
6
7
8
9