2017-08-05 5 views
-2

Je sais qu'il y a beaucoup de questions avec des titres similaires ici, mais personne ne semble travailler pour moi. J'ai ce genre de fichier txt:Stocker le fichier .txt dans un char * 2d Vecteur C++

tree pine 
color blue 
food pizza 

et je veux stocker les éléments dans un vecteur char * 2d, comme

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

Voici le code:

// 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; 
} 

Mais quand je cours le code une exception est levée.

Exception thrown: write access violation. 

Comment puis-je résoudre ce problème? Merci

+0

"Comment puis-je résoudre ce problème?" Commencez par utiliser 'std :: string'. – DimChtz

+0

Quel compilateur utilisez-vous? – Aan

+0

Sur quelle ligne/dans quelle fonction l'exception est-elle levée? Comment 'storeData' est-il implémenté? Nous ne connaissons pas l'historique de votre projet, vous devez donc fournir des informations aussi complètes que possible. – meowgoesthedog

Répondre

0

Avertissement: Je n'ai pas de compilateur en main pour tester le code suivant avec des fichiers, mais cela devrait fonctionner.

est ici une référence je: Parse (split) a string in C++ using string delimiter (standard C++)

Discription: Fondamentalement, le code suivant le passé parse dans la ligne de fichier en ligne affecte ensuite le premier mot et le second mot dans le vecteur. Notez que j'ai utilisé string (s) dans l'exemple parce que je ne voulais pas penser à la gestion de la mémoire.

#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

Vous n'avez affecté aucune mémoire dans laquelle les données peuvent être écrites. Vous auriez besoin de quelque chose comme char* word = new char[50];. Mais il suffit d'utiliser un std::string c'est plus sûr et plus facile.