我知道这里有很多类似标题的问题,但似乎没有人能为我工作。 我有这种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.
我该如何解决这个问题? 谢谢
答案 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);
}