gpt4 book ai didi

c++ ifstream,从文件读取崩溃

转载 作者:行者123 更新时间:2023-12-02 02:01:01 24 4
gpt4 key购买 nike

首先,我为我的英语表示歉意。
我在尝试编写一个 XML 解析器时遇到了一个奇怪的问题。为了解释我的问题,我应该说,我有一个 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->read(c,3);] 的第五行时,程序崩溃了。
我想知道为什么会出现这种情况?

最佳答案

您传递给 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;
}

关于c++ ifstream,从文件读取崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47336356/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com