c ++ ifstream,从文件中读取崩溃
c++ ifstream , Reading from file crashes
一开始我为我的英语道歉。
我在尝试编写一个 XML 解析器时遇到了一个奇怪的问题。
为了解释我的问题,我应该说,我有一个 xml 解析器 class,它有一个 ifstream 成员。而这个 class 有一个函数,它读取直到它到达一个与给定输入匹配的开放标签。
这是我正在研究的解析器 class:
// 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;
}
我发现当main函数的第五行[parser.stream->read(c,3);[=29=时程序崩溃了]]被执行。
我想知道为什么会这样?
您传递给 ifstream::read
的字符指针未初始化,因此指向无效的内存区域,导致您的程序崩溃。您需要它指向您分配的缓冲区:
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;
}
一开始我为我的英语道歉。
我在尝试编写一个 XML 解析器时遇到了一个奇怪的问题。
为了解释我的问题,我应该说,我有一个 xml 解析器 class,它有一个 ifstream 成员。而这个 class 有一个函数,它读取直到它到达一个与给定输入匹配的开放标签。
这是我正在研究的解析器 class:
// 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;
}
我发现当main函数的第五行[parser.stream->read(c,3);[=29=时程序崩溃了]]被执行。
我想知道为什么会这样?
您传递给 ifstream::read
的字符指针未初始化,因此指向无效的内存区域,导致您的程序崩溃。您需要它指向您分配的缓冲区:
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;
}