c ++跳过行,然后将CSV文件中的十六进制值读入2D文档

时间:2016-08-23 21:25:22

标签: c++ csv

我正在尝试使用c ++从CSV文件中将十六进制值读入二维数组。我比较新,所以我可以帮忙。

我想跳过前98行(主要由文本组成),然后从文件中读取接下来的100行。有22个逗号分隔列,我只需要第8,10和13-20列。第8列包含一个字符串,其余包含十六进制值。

以下是我所拥有的。它编译(不知何故)但我不断收到分段错误。我想我需要为数组动态分配空间。此外,代码不考虑字符串或int到十六进制转换。

主要目前没有做任何事情,这只是来自测试套件。

#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <sstream>
#include <stdlib.h>

const int ROWS = 100; // CAN messages
const int COLS = 22; // Colums per message
const int BUFFSIZE = 80;

using namespace std;

int **readCSV() {

    int **array = 0;
    std::ifstream file( "power_steering.csv" );
    std::string line; 
    int col = 0;
    int row = 0;

    if (!file.is_open())
    {
        return 0;
    }

    for (int i = 1; i < 98; i++){
        std::getline(file, line); // skip the first 98 lines
    }

    while( std::getline( file, line ) ) {

        std::istringstream iss( line );
        std::string result;

        while( std::getline( iss, result, ',' ) ) {

            array[row][col] = atoi( result.c_str() );
            col = col+1;
        }
        row = row+1;
        col = 0;
    }
    return array;
}

int main() {

    int **array;
    array = readCSV();

    for (int i = 0; i < 100; i++) {
        cout<<array[i][0];
    }

    return 0;
}

1 个答案:

答案 0 :(得分:2)

由于您尝试在array[row][col]中存储值而未为array分配内存,因此出现了分段错误错误。

我的建议:不要使用int** array;。请改用std::vector<std::vector<int>> array;。这样就不需要为代码中的对象分配和释放内存。让std::vector为您处理内存管理。

std::vector<std::vector<int>> readCSV() {

   std::vector<std::vector<int>> array;
   std::ifstream file( "power_steering.csv" );
   std::string line; 

   if (!file.is_open())
   {
      return array;
   }

   for (int i = 1; i < 98; i++){
      std::getline(file, line); // skip the first 98 lines
   }

   while( std::getline( file, line ) ) {

      std::istringstream iss( line );
      std::string result;

      std::vector<int> a2;
      while( std::getline( iss, result, ',' ) ) {
         a2.push_back(atoi( result.c_str() ));
      }

      array.push_back(a2);
   }

   return array;
}

int main() {

   std::vector<std::vector<int>> array = readCSV();

   for (int i = 0; i < 100; i++) {
      cout<<array[i][0];
   }

   return 0;
}