使用copy和ostream_iterator删除为向量写入的CSV文件中的尾随逗号

时间:2015-10-13 04:47:13

标签: c++ csv vector std ostream

我有以下功能,它将vector写入CSV文件:

#include <math.h>
#include <vector>
#include <string>
#include <fstream>
#include <iostream>
#include <iterator>
using namespace std;

bool save_vector(vector<double>* pdata, size_t length,
                 const string& file_path)
{
  ofstream os(file_path.c_str(), ios::binary | ios::out);
  if (!os.is_open())
    {
      cout << "Failure!" << endl;
      return false;
    }
  os.precision(11);
  copy(pdata->begin(), pdata->end(), ostream_iterator<double>(os, ","));
  os.close();
  return true;
}

但是,CSV文件的结尾如下所示:

1.2000414752e-08,1.1040914566e-08,1.0158131779e-08,9.3459324063e-09,

也就是说,尾随的逗号被写入文件中。当我尝试使用其他软件程序加载文件时,这会导致错误。

最简单,最有效的方法是摆脱(理想情况下,永远不会写下)这个尾随的逗号?

3 个答案:

答案 0 :(得分:3)

正如您所观察到的那样,通过switch (pos) { 进行复制并不起作用,另外还会输出一个std::copy。有一个提案可能会在未来的C ++ 17标准中使用它:ostream_joiner,它将完全符合您的预期。

但是,现在可以使用的快速解决方案是手动完成。

,

答案 1 :(得分:0)

我省略了通过处理第一个特殊元素来打印逗号:

DECLARE @first AS INT
SET @first = 1
DECLARE @step AS INT
SET @step = 1
DECLARE @last AS INT
SET @last = 10

BEGIN TRANSACTION
WHILE(@first <= @last) BEGIN INSERT INTO classifier VALUES(@first) SET @first += @step 
END 
COMMIT TRANSACTION

显然,此代码会进入打印可打印范围适配器的功能。

答案 2 :(得分:0)

除了已经列出的方法以外,还有很多方法:

std::string sep;
for (const auto& x : *pdata) {
    os << x << clusAvg;
    sep = ", ";
}

auto it = pdata->begin();
if (it != pdata->end()) {
    os << *it;
    for(; it != pdata->end(); ++it)
        os << ", " << *it;
}

auto it = pdata->end();
if (it != pdata->begin()) {
    --it;
    std::copy(pdata->begin(), it, ostream_iterator<double>(os, ", "));
    os << *it;
}