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

时间:2017-11-16 18:02:00

标签: c++ xml crash ifstream

一开始我为我的英语道歉 我试图写一个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); ]的第五行被执行时程序崩溃了。
我想知道为什么会这样?

1 个答案:

答案 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;
}