将.txt文件存储到char * 2d Vector C ++中

时间:2017-08-05 16:08:42

标签: c++ arrays char

我知道这里有很多类似标题的问题,但似乎没有人能为我工作。 我有这种txt文件:

tree pine
color blue
food pizza

我希望将项目存储在char * 2d向量中,例如

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

这是代码:

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

但是当我运行代码时会抛出异常。

Exception thrown: write access violation.

我该如何解决这个问题? 谢谢

2 个答案:

答案 0 :(得分:1)

您尚未分配可写入数据的任何内存。你需要像char* word = new char[50];这样的东西。但只需使用std::string它就会更安全,更容易。

答案 1 :(得分:0)

免责声明:我手边没有编译器来测试以下代码和文件,但它应该可以正常工作。

以下是我使用的参考资料:Parse (split) a string in C++ using string delimiter (standard C++)

Discription:基本上,以下代码逐行解析传入的文件,然后将第一个单词和第二个单词分配给向量。请注意,我在示例中使用了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);
}