简体   繁体   中英

c++ ifstream , Reading from file crashes

At the beginning I apologize for my English.
I was trying to write a XML Parser that I encountered a weird problem. to explain my problem I should say, I have a xml parser class that has an ifstream member. And this class has a function which reads until it reaches an open tag matching with the given input.
this is the parser class I was working on:

// 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;
                    }
                }
            }   
        }
};

in the nextTag function I read the file until I reach the open tag which name's matches with the given input.

and here is my main function

int main(){
    XMLParser parser("test.xml");
    cout << "ready\n";
    parser.nextTag("Log");
    char *c;
    parser.stream->read(c,3);
    cout << c << endl;
    return 0;
}

I have figured out that the program crashes when the fifth line of the main function [ parser.stream->read(c,3); ] is executed.
I wonder why this happens?

The char pointer you pass to ifstream::read is not initialized and thus points to an invalid memory region, causing your program to crash. You need it to point to a buffer you allocated:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM