2017-08-05 1 views
-2

ここで類似のタイトルの質問がたくさんあることは知っていますが、誰も私のために働いていないようです。.txtファイルをchar * 2d Vector C++に格納する

// parse configuration file 
bool Configuration::fileParser(char* filename) 
{ 
    vector<vector<char*>> data; 
    fstream fin("data/setup.txt"); 
    string line; 
    while (fin && getline(fin, line)) 
    { 
     vector<char*> confLine; 
     char* word = NULL; 
     stringstream ss(line); 
     while (ss && ss >> word) 
     { 
      confLine.push_back(word); 
     } 
     data.push_back(confLine); 
    } 
    storeData(data); 
    return 0; 
} 
:これはコードであるように

vector<vector<char*>> data; 
.. 
.. 
data[0][0] = tree 
data[0][1] = pine 
data[1][1] = blue 
ecc 

として、

tree pine 
color blue 
food pizza 

と私は、char * 2Dベクトルにアイテムを格納したい: 私はtxtファイルのこの種を持っています

しかし、コードを実行すると例外がスローされます。

Exception thrown: write access violation. 

どうすればこの問題を解決できますか? ありがとうございます

+0

"どうすればこの問題を解決できますか?"まず 'std :: string'を使い始めます。 – DimChtz

+0

どのコンパイラを使用しますか? – Aan

+0

どのライン/どの機能で例外がスローされますか? 'storeData'はどのように実装されていますか?私たちはあなたのプロジェクトの背景を知らないので、可能な限り完全な情報として提供しなければなりません。 – meowgoesthedog

答えて

0

免責事項:次のコードをファイルでテストするコンパイラは手元にありませんが、動作するはずです。 Parse (split) a string in C++ using string delimiter (standard C++)

Discription:基本的に以下のコードは、行毎にファイルに渡された構文解析次いでベクターに最初のワード及び第2ワードを割り当てるここ

は私が使用される基準です。この例ではstring(s)を使用したことに注意してください。これはメモリ管理について考えたくないからです。

#pragma once 
#include <vector> 
#include <fstream> 
#include <string> 

void Configuration::fileParser(string fileName) 
{ 
    vector<vector<string>> data; 

    ifstream configFile(fileName); 
    string line, token; 
    string delimiter = " "; 
    size_t pos; 
    if (configFile.is_open()) 
    { 
     int n = 0; 
     while (getline(configFile, line)) 
     { 
      if (!line || line == "") 
       break; //added as a safety measure 
      pos = 0; 
      if ((pos = line.find(delimiter)) != string::npos) 
      { 
       token = line.substr(0, pos); 
       data[n][0] = token; //add first word to vector 
       line.erase(0, pos + delimiter.length()); 
      } 
      if ((pos = line.find(delimiter)) != string::npos) 
      { 
       token = line.substr(0, pos); 
       data[n][1] = token; //add second word to vector 
       line.erase(0, pos + delimiter.length()); 
      } 
      n++; 
     } 
    } 
    storeData(data); 
} 
1

データを書き込むことができるメモリを割り当てていません。 char* word = new char[50];のようなものが必要です。しかし、ちょうどstd::stringを使用すると、より安全で簡単です。

関連する問題