使用c ++文件处理从文件读取时出现异常错误

时间:2018-03-17 06:40:40

标签: c++ exception file-handling

此程序将一个字符串(学生姓名)作为输入,根据文件中已存在的学生数生成该学生的卷号。然后将此信息存储为该文件中的结构。进一步的细节在评论中。这段代码工作正常,直到我更改其中任何一个 - >

  1. 在main()函数中,如果我发送'data stud'作为参考,它可以正常工作。但是如果我把它作为副本发送,这意味着每次都要在文件中创建一个新的对象用于写入和读取(这很好,不是吗?)。它给出了例外。
  2. 在rollGen()函数中,我创建了一个类数据的对象temp,用于计算其数据已存在于该文件中的学生数。如果动态创建此对象,则代码正在运行。但是如果我静态地创建它,程序就会给出异常(例如参见注释)。 我想知道,为什么会发生这种情况是否与范围相关......或者其他什么。提前致谢。例外 -
  3. enter image description here

        #include<iostream>
        #include<string>
        #include<fstream>
    
        struct student
        {
            char RollNo[8];
            std::string name;
        };
    
        class data
        {
            student stu;
        public:
            data() {}
            //open a file for fstream in argument...mod = 0 for input mode...mod = 1 for output mode
            void openn(int mod, std::fstream* yo_fp)    
            {
                if (mod == 0)
                {
                    yo_fp->open("cs.txt", std::ios::in);
                }
                else if (mod == 1)
                {
                    yo_fp->open("cs.txt", std::ios::out | std::ios::app);
                }
            }
            //generates roll number of student 
            //for example if data of 3 students is already present in file then roll number of new student will be cs4
            void rollGen()
            {
                std::fstream* rg_fp = new std::fstream;
                openn(0, rg_fp);
                int i = 1;
                data* temp = new data;  
                //if I allocate temp on stack...like, 'data temp;' and then in while loop replace 'temp' with '&temp'...programm is giving exception
                //counting number of students whose data is already present in file
                while (rg_fp->read((char*)temp, sizeof(data)))
                {
                    i++;
                }
                strcpy_s(stu.RollNo, "cs"); 
                std::string s = std::to_string(i);
                strcat_s(stu.RollNo, s.c_str());
                rg_fp->close();
                delete rg_fp;
            }
            //take name string as input and call roll number generation function. hence providing data to student stu struct present in this class
            void input()
            {
                std::cout << "Enter your name - ";
                getline(std::cin, stu.name);
                rollGen();
                std::cout << "your RollNo is - " << stu.RollNo << std::endl;
            }
            //printing tha data of student stu struct present in class
            void output()
           {
                std::cout << "roll no - " << stu.RollNo << std::endl;
                std::cout << "name - " << stu.name << std::endl;
            }
        };
        //write the data of class object into file after calling input() function
        //using 'data stud' in argument instead of 'data& stud' gives exception
        void write(data& stud, std::fstream* cur_fp)
        {
            stud.input();
            stud.openn(1, cur_fp);
            cur_fp->write((char*)&stud, sizeof(data));
            std::cout << std::endl;
            cur_fp->close();
        }
        //printing all elements of file one by one
        //using 'data stud' in argument instead of 'data& stud' gives exception
        void read(data& stud, std::fstream* cur_fp)
        {
            stud.openn(0, cur_fp);
            std::cout << "Data in File is - " << std::endl << std::endl;;
            while (cur_fp->read((char*)&stud, sizeof(data)))
            {
                stud.output();
                std::cout << std::endl;
            }
            cur_fp->close();
            std::cin.get();
        }
    
        int main()
        {
            std::fstream *fp = new std::fstream;
            data stud;
            write(stud, fp);
            write(stud, fp);
            read(stud, fp);
            delete fp;
        }
    

1 个答案:

答案 0 :(得分:0)

data包含成员字段sudent stu,其中包含成员字段std::string name,它通过从文件data中读取rg_fp->read((char*)temp, sizeof(data))个对象来存储堆上的内容你基本上用无效指针填充字符串,导致各种未定义的行为。请注意,将其写入cur_fp->write((char*)&stud, sizeof(data));之类的文件无效,因为未写入字符串内容。您应该逐个实现适当的[de]序列化存储每个类字段的内容。