微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C ++ |将字符串推入空向量会导致第一个元素损坏?

如何解决C ++ |将字符串推入空向量会导致第一个元素损坏?

我一直在研究*.csv解析器,并且在大多数情况下都可以使用。解析基本上是这样的:

  1. 为指定的*.csv文件打开流(在构造函数中必须提供文件路径,数据列数和定界符)。

  2. 获取每一行,直到文件末尾。对于提取的每个原始csv行:

    i)将这一行流式传输为line_stream(使用std::istringstream)。

    ii)(使用构造函数提供的定界符)将该流分成较小的字符串标记,并推入字符串向量。

  3. 可以通过专用接口database接口访问提取的数据字符串,直到解析器对象销毁(或者直到我实现将其转换为可用数据的字符串处理器为止)。

解析器对象正常工作,除了总是删除向量的第一个字符串元素的第一个字符。例如:

0544,1,Kitchenware,2,27

变成了:

544,27

这是令人无法接受的信息丢失,但是我无法弄清楚此问题的原因。我已经通过在每个数据包迭代器之前推送一个dummy字符串来解决此问题,

,ummy,0544,27

但是我仍然觉得这是一个非常糟糕的实现。


我怀疑这是line_stream的问题,但并不完全确定如何解决

下面是源代码

#ifndef _CSVPARSER_HPP
#define _CSVPARSER_HPP

#include <fstream>
#include <iostream>
#include <sstream>
#include <vector>

using namespace std;

const char DEFAULT_COLUMNS_SEParaTOR = ',';

class csvStream {
 private:
  void _setopen() { inStream.open(fpath,ios::in); }

 protected:
  string fpath;
  fstream inStream;

 public:
  explicit csvStream(const string& path) {
    fpath = path;
    _setopen();
  }
};

template <typename T>
class csvParser : protected csvStream {
 private:
  int numDataTypes;
  char col_separator;
  string extractedRawLine;
  // Database of extracted packets of data as strings.
  vector<vector<string>*> database;

  // Return a reference to <data as a packet of strings>.
  vector<string>& _rawToStringPacket() {
    // line stream buffer & token
    istringstream line_stream;
    static string token;
    // new packet on the heap
    vector<string>* packet = nullptr;
    packet = new vector<string>;
    // extract strings into packet
    line_stream.str(extractedRawLine);

    packet->push_back("dummy");
    for (int i = 1; i < numDataTypes + 1; ++i) {
      getline(line_stream,token,col_separator);
      packet->push_back(token);
    }
    return *packet;
  }

  /****************************PUBLIC-API****************************/
 public:
  // Explicit Constructor: Must supply path to a *.csv file and the number of
  // data columns.
  explicit csvParser(const string& path,const int ntypes,const char sptr = ',')
      : csvStream(path),numDataTypes{ntypes},col_separator{sptr} {}

  // Extract all data while stream is open.
  void extractAllRaw() {
    // continue to extract data until the end of file:
    while (getline(*inStream,extractedRawLine)) {
      static vector<string>* temp = nullptr;
      temp = &_rawToStringPacket();
      database.push_back(temp);
    }
  }

  // Stream the data elements to standard output.
  void printDatabase(ostream& os = cout) {
    for (auto i : database) {
      for (int j = 0; j < static_cast<int>(i->size()); ++j) {
        os << (*i)[j] << ",";
      }
      os << '\n';
    }
  }
};

#endif

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。