从std :: ofstream逐行读取(但不是从文件中读取)

时间:2014-12-08 19:56:07

标签: c++ inputstream ifstream outputstream ofstream

在我的项目中,我需要使用以下库(OMPL)。我特别感兴趣的是成员函数printAsMatrix(std :: ofstream& out),它将数据输出到终端或文件。这里是function

 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;
 }

但我需要那些原始形式的输出值,为double。出于这个原因,我想通过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数据,我收到很多编译错误。

继承我作为临时解决方案所做的事情:

  1. 创建了一个新的ifstream变量:

    std :: ifstream input_matrix;

  2. 试图将输出的矩阵复制到输入中:

    solution_matrix&lt;&lt; input_matrix;

  3. 使用新变量调用getline函数:

    getline(input_matrix,buffer);

  4. 我现在没有编译错误,但代码根本不起作用。另外,我不确定我是否以正确的方式做到了。

    环顾四周,我找到了大量示例,首先使用文件复制数据,然后使用ifstream从同一文件中读取。类似的东西:

      // Print the solution path to a file
      std::ofstream ofs("path.dat");
      pg->printAsMatrix(ofs);
    

    但要做到这一点,我需要创建一个新文件,将其保存在硬盘上,然后使用ifstream再次打开它:

    std::ifstream file;
    file.open( "path.dat" );
    

    这种方式有效但我真的不想创建文件。 有没有办法做到这一点:

    1. 没有创建文件;
    2. 逐行读取矩阵(我将对值进行排序);
    3. 非常感谢

1 个答案:

答案 0 :(得分:0)

您可以std::stringstream使用std::getlineostream可以作为std::stringstream solution_matrix; pg->printAsMatrix( solution_matrix ); std::string line; while (std::getline(solution_matrix, line)) { std::cout << line << std::endl; } 参数传递给您的函数。例如:

<<

此外,你的std::cout >> var1 >> var2; 在你的cout声明中是错误的方式:

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()与您的example函数类似,因为它会写入ostream。向量0 1 2 3 4 5 6 7 8 9 包含值0-9。输出是:

{{1}}