当前位置: 首页 > 知识库问答 >
问题:

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

南宫凯康
2023-03-14

在我的项目中,我需要使用以下库(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" );
    

    这种方式可以工作,但我真的不想创建一个文件。有没有办法做到:

    1. 而不创建文件;
    2. 逐行读取矩阵(我将整理值);

    很多人提前道谢

  • 共有1个答案

    戈博易
    2023-03-14

    您可以将std::StringStreamstd::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
    
     类似资料:
    • 问题内容: 我在S3中有一个csv文件,我正在尝试读取标题行以获取大小(这些文件是由我们的用户创建的,因此它们几乎可以是任何大小)。有没有办法使用boto做到这一点?我以为也许我们可以使用python BufferedReader,但是我不知道如何从S3键打开流。任何建议都很好。谢谢! 问题答案: 看来boto具有可以执行此操作的功能。这是一些对我有用的代码: 调用会从对象返回下一个n个字节。 当

    • 问题内容: 请看下面的代码 在这里,首先获取文件的字节,然后将其写入文本文件。然后,我阅读了该文本文件,逐行阅读,并为每一行生成了一个单独的.txt文件。现在,原始程序被拆分为数千个文件。现在,我需要阅读所有.txt文件并重新生成.txt文件。我不知道怎么做最后一件事。我怎样才能做到这一点?请帮忙! 问题答案: 如果要操作任何类型的文件,请不要认为它们包含文本数据,而应将它们视为包含字节的二进制文

    • 使用boto3,您可以从S3中的某个位置读取文件内容,给定一个bucket名称和密钥,如所示(这假设一个初步的) 这将返回一个字符串类型。我需要获取的特定文件恰好是一组类似字典的对象,每行一个。所以它不是JSON格式。我不想将其作为字符串读取,而是将其作为文件对象进行流式处理并逐行读取;除了先在本地下载该文件外,找不到其他方法来执行此操作 我想问的是,是否有可能在不必先在本地下载的情况下对文件进行

    • 我正在努力阅读附加的TXT文件,以csv形式显示从文件中读取的每个字段,我做了一个接近我想要的代码,但我没有前进。 TXT文件格式: 我的代码在我想要的位置读取第一行,但下面的行我不能,更不用说重复文件中包含的下一个工资单的读数了。 目前的输出是这样的: 出口应该是怎样的 逐行读取和捕获数据,我必须完成一个工资单,它将在输出中形成一行,第二个工资单将在输出中形成第二行,因此,直到txt文件结束,此

    • 我正在试着阅读我的文件的每一行,其中包含一个用户名列表,并用它创建一个登录系统。我正在尝试实现一个基本的登录系统,它的用户名存储在.txt文件中,但我的代码不工作,我不知道为什么。我认为问题出在检查用户名的循环中。 这是我的代码,但它不起作用,只是打印总是失败: 有什么想法吗?