以递归方式附加到 .csv 文件

Posted

技术标签:

【中文标题】以递归方式附加到 .csv 文件【英文标题】:Appending to .csv file recursively 【发布时间】:2020-04-12 15:06:59 【问题描述】:

我有一个生成重复组合的回溯函数,以及一个将组合值作为参数的函数的附加值。

组合存储为向量,因此,我希望我的 csv 文件具有两列的输出,类似于:

    vector | result
    1 1 1 1 , 0.25
    1 1 1 2 , 0.2
    …
    4 4 4 4 , 0.16

但是,我的输出被单独拆分,我只得到递归中的最后一个值,看起来像这样

A | B | C | D | E
4   4   4   4 , 0.16

这是我正在使用的函数:

void backtrack(int a[], std::vector<int> &rez, int i, int n) 

    std::ofstream f;
    f.open ("comb_unsorted.csv");

    if (rez.size() == n) 
        for (auto it = rez.begin(); it != rez.end(); it++)
            f << *it << " ";

        f << ",";
        f << function(rez);
        f << '\n';

        return;
    

    for (int j = i; j < n; j++) 

        rez.push_back(a[j]);
        backtrack(a, rez, j, n);
        rez.pop_back();

        while (j <= n && a[j] == a[j + 1])
            j++;
    
    f.close();

【问题讨论】:

当您使用调试器运行程序时,您看到了什么?这就是调试器的用途。如果您不知道如何使用调试器,这是一个学习如何使用调试器一次运行一行的好机会,监控所有变量及其值的变化,并分析程序的逻辑执行流程。知道如何使用调试器是每个 C++ 开发人员必备的技能,没有例外。在调试器的帮助下,您应该能够快速找到此程序以及您编写的所有未来程序中的所有错误,而无需向任何人寻求帮助。 backtrack 打开一个文件,然后递归调用自身。该递归调用尝试打开同一个文件 - 失败,因为该文件已在其他地方打开。您想在 backtrack 之外打开文件,并通过所有递归调用传递对它的引用。 您能否提供 a[] 的内容(至少前 5 个值)以及您在函数内部为第一次调用传递的参数? @vamirio-chan a[] 是 1,1,2,3..n 的数组,用于输入的 n 【参考方案1】:
#include <iostream>
#include <sstream>
#include <fstream>
#include <algorithm>
#include <iterator>
#include <vector>
using namespace std;

int function(vector<int>& rez) 
   return 1;


void backtrack(const int arr[], vector<int>& out, const int arrSize, const size_t maxLength) 
   // You should not do this! This is just an example!
   // In order to open/close file properly - do it outside this function and then pass std::ofstream as 5th argument
   static ofstream file("output.csv");

   if (maxLength == 1) 
      stringstream dataFromOut;
      copy(out.begin(), out.end(), ostream_iterator<int>(dataFromOut, " "));
      for (int j = 0; j < arrSize; j++)
         file << dataFromOut.str() << arr[j] << " , " << function(out) << endl;
      return;
   
   for (int i = 0; i < arrSize; i++) 
      out.push_back(arr[i]);
      backtrack(arr, out, arrSize, maxLength - 1);
      out.pop_back();
   


int main() 
   int str[] =  1, 2, 3, 4 ;
   int arrSize = 4;
   vector<int> test;
   backtrack(str, test, arrSize, arrSize);
   return 0;

这是输出:

1 1 1 1 , 1
1 1 1 2 , 1
1 1 1 3 , 1
1 1 1 4 , 1
1 1 2 1 , 1
1 1 2 2 , 1
1 1 2 3 , 1
1 1 2 4 , 1
1 1 3 1 , 1
1 1 3 2 , 1
1 1 3 3 , 1
1 1 3 4 , 1
1 1 4 1 , 1
1 1 4 2 , 1
1 1 4 3 , 1
1 1 4 4 , 1
1 2 1 1 , 1
1 2 1 2 , 1
1 2 1 3 , 1
1 2 1 4 , 1
1 2 2 1 , 1
1 2 2 2 , 1
1 2 2 3 , 1
1 2 2 4 , 1
1 2 3 1 , 1
1 2 3 2 , 1
1 2 3 3 , 1
1 2 3 4 , 1
1 2 4 1 , 1
1 2 4 2 , 1
1 2 4 3 , 1
1 2 4 4 , 1
1 3 1 1 , 1
1 3 1 2 , 1
1 3 1 3 , 1
1 3 1 4 , 1
1 3 2 1 , 1
1 3 2 2 , 1
1 3 2 3 , 1
1 3 2 4 , 1
1 3 3 1 , 1
1 3 3 2 , 1
1 3 3 3 , 1
1 3 3 4 , 1
1 3 4 1 , 1
1 3 4 2 , 1
1 3 4 3 , 1
1 3 4 4 , 1
1 4 1 1 , 1
1 4 1 2 , 1
1 4 1 3 , 1
1 4 1 4 , 1
1 4 2 1 , 1
1 4 2 2 , 1
1 4 2 3 , 1
1 4 2 4 , 1
1 4 3 1 , 1
1 4 3 2 , 1
1 4 3 3 , 1
1 4 3 4 , 1
1 4 4 1 , 1
1 4 4 2 , 1
1 4 4 3 , 1
1 4 4 4 , 1
2 1 1 1 , 1
2 1 1 2 , 1
2 1 1 3 , 1
2 1 1 4 , 1
2 1 2 1 , 1
2 1 2 2 , 1
2 1 2 3 , 1
2 1 2 4 , 1
2 1 3 1 , 1
2 1 3 2 , 1
2 1 3 3 , 1
2 1 3 4 , 1
2 1 4 1 , 1
2 1 4 2 , 1
2 1 4 3 , 1
2 1 4 4 , 1
2 2 1 1 , 1
2 2 1 2 , 1
2 2 1 3 , 1
2 2 1 4 , 1
2 2 2 1 , 1
2 2 2 2 , 1
2 2 2 3 , 1
2 2 2 4 , 1
2 2 3 1 , 1
2 2 3 2 , 1
2 2 3 3 , 1
2 2 3 4 , 1
2 2 4 1 , 1
2 2 4 2 , 1
2 2 4 3 , 1
2 2 4 4 , 1
2 3 1 1 , 1
2 3 1 2 , 1
2 3 1 3 , 1
2 3 1 4 , 1
2 3 2 1 , 1
2 3 2 2 , 1
2 3 2 3 , 1
2 3 2 4 , 1
2 3 3 1 , 1
2 3 3 2 , 1
2 3 3 3 , 1
2 3 3 4 , 1
2 3 4 1 , 1
2 3 4 2 , 1
2 3 4 3 , 1
2 3 4 4 , 1
2 4 1 1 , 1
2 4 1 2 , 1
2 4 1 3 , 1
2 4 1 4 , 1
2 4 2 1 , 1
2 4 2 2 , 1
2 4 2 3 , 1
2 4 2 4 , 1
2 4 3 1 , 1
2 4 3 2 , 1
2 4 3 3 , 1
2 4 3 4 , 1
2 4 4 1 , 1
2 4 4 2 , 1
2 4 4 3 , 1
2 4 4 4 , 1
3 1 1 1 , 1
3 1 1 2 , 1
3 1 1 3 , 1
3 1 1 4 , 1
3 1 2 1 , 1
3 1 2 2 , 1
3 1 2 3 , 1
3 1 2 4 , 1
3 1 3 1 , 1
3 1 3 2 , 1
3 1 3 3 , 1
3 1 3 4 , 1
3 1 4 1 , 1
3 1 4 2 , 1
3 1 4 3 , 1
3 1 4 4 , 1
3 2 1 1 , 1
3 2 1 2 , 1
3 2 1 3 , 1
3 2 1 4 , 1
3 2 2 1 , 1
3 2 2 2 , 1
3 2 2 3 , 1
3 2 2 4 , 1
3 2 3 1 , 1
3 2 3 2 , 1
3 2 3 3 , 1
3 2 3 4 , 1
3 2 4 1 , 1
3 2 4 2 , 1
3 2 4 3 , 1
3 2 4 4 , 1
3 3 1 1 , 1
3 3 1 2 , 1
3 3 1 3 , 1
3 3 1 4 , 1
3 3 2 1 , 1
3 3 2 2 , 1
3 3 2 3 , 1
3 3 2 4 , 1
3 3 3 1 , 1
3 3 3 2 , 1
3 3 3 3 , 1
3 3 3 4 , 1
3 3 4 1 , 1
3 3 4 2 , 1
3 3 4 3 , 1
3 3 4 4 , 1
3 4 1 1 , 1
3 4 1 2 , 1
3 4 1 3 , 1
3 4 1 4 , 1
3 4 2 1 , 1
3 4 2 2 , 1
3 4 2 3 , 1
3 4 2 4 , 1
3 4 3 1 , 1
3 4 3 2 , 1
3 4 3 3 , 1
3 4 3 4 , 1
3 4 4 1 , 1
3 4 4 2 , 1
3 4 4 3 , 1
3 4 4 4 , 1
4 1 1 1 , 1
4 1 1 2 , 1
4 1 1 3 , 1
4 1 1 4 , 1
4 1 2 1 , 1
4 1 2 2 , 1
4 1 2 3 , 1
4 1 2 4 , 1
4 1 3 1 , 1
4 1 3 2 , 1
4 1 3 3 , 1
4 1 3 4 , 1
4 1 4 1 , 1
4 1 4 2 , 1
4 1 4 3 , 1
4 1 4 4 , 1
4 2 1 1 , 1
4 2 1 2 , 1
4 2 1 3 , 1
4 2 1 4 , 1
4 2 2 1 , 1
4 2 2 2 , 1
4 2 2 3 , 1
4 2 2 4 , 1
4 2 3 1 , 1
4 2 3 2 , 1
4 2 3 3 , 1
4 2 3 4 , 1
4 2 4 1 , 1
4 2 4 2 , 1
4 2 4 3 , 1
4 2 4 4 , 1
4 3 1 1 , 1
4 3 1 2 , 1
4 3 1 3 , 1
4 3 1 4 , 1
4 3 2 1 , 1
4 3 2 2 , 1
4 3 2 3 , 1
4 3 2 4 , 1
4 3 3 1 , 1
4 3 3 2 , 1
4 3 3 3 , 1
4 3 3 4 , 1
4 3 4 1 , 1
4 3 4 2 , 1
4 3 4 3 , 1
4 3 4 4 , 1
4 4 1 1 , 1
4 4 1 2 , 1
4 4 1 3 , 1
4 4 1 4 , 1
4 4 2 1 , 1
4 4 2 2 , 1
4 4 2 3 , 1
4 4 2 4 , 1
4 4 3 1 , 1
4 4 3 2 , 1
4 4 3 3 , 1
4 4 3 4 , 1
4 4 4 1 , 1
4 4 4 2 , 1
4 4 4 3 , 1
4 4 4 4 , 1

【讨论】:

以上是关于以递归方式附加到 .csv 文件的主要内容,如果未能解决你的问题,请参考以下文章

迭代长列表以生成较小的列表并附加到 csv

附加两个csv文件时如何修复pandas concat

Access数据表怎么导出.csv格式的文件并附加到oracle数据库?

使用python批量将匹配行附加到csv文件

将缺失值附加到 CSV 文件

将缺失值附加到 CSV 文件