一开始我为我的英语道歉 我试图写一个XML Parser,我遇到了一个奇怪的问题。 为了解释我的问题,我应该说,我有一个xml解析器类,它有一个 ifstream 成员。并且该类具有一个函数,该函数读取直到它到达与给定输入匹配的开放标记 这是我正在研究的解析器类:
// XMLParser.cpp
#include <fstream>
#include "Stack.h"
using namespace std;
class XMLParser{
private:
int charReadRate = 3;
public:
ifstream *stream;
XMLParser(string add){
stream = new ifstream(add); // open input stream
}
void nextTag(string tag){
// find the first occurance of open-tag with name 'tag'
cout << "nextTag\n";
char * readData;
string tagName="";
stream->read(readData, charReadRate);
int len = string(readData).length();
int i = 0;
// cout << len << endl;
while(true){
if((*readData) == '<'){
readData++;
i++;
while(*readData != '>'){
tagName+=*readData;
readData++;
i++;
if(i>=len){
if(stream->eof()){
return ; // error didn't find
}
stream->read(readData, charReadRate);
// cout << readData << endl;
len = string(readData).length();
i = 0;
}else{
if(tagName == tag){
// cout << "find\n";
stream->seekg(i-len, ios::cur);
return;
}
}
}
}else{
readData++;
i++;
if(i>=len){
if(stream->eof()){
return ; // error didn't find
}
stream->read(readData, charReadRate);
len = string(readData).length();
i = 0;
}
}
}
}
};
在 nextTag 函数中,我读取文件,直到找到名称与给定输入匹配的开放标记。
这是我的主要功能
int main(){
XMLParser parser("test.xml");
cout << "ready\n";
parser.nextTag("Log");
char *c;
parser.stream->read(c,3);
cout << c << endl;
return 0;
}
我已经发现当主函数[ parser.stream-&gt; read(c,3); ]的第五行被执行时程序崩溃了。
我想知道为什么会这样?
答案 0 :(得分:0)
传递给ifstream::read
的char指针未初始化,因此指向无效的内存区域,导致程序崩溃。你需要它指向你分配的缓冲区:
int main(){
XMLParser parser("test.xml");
cout << "ready\n";
parser.nextTag("Log");
char c[3];
parser.stream->read(c,3);
cout << c << endl;
return 0;
}