C++ 程序在读取文件C++;

C++ 程序在读取文件C++;,c++,file-io,C++,File Io,我目前正在检查是否已检索到保存在“data.txt”中的数据,因此这是我仅有的accept函数代码。每次我在文件末尾,程序都会崩溃。我可以正确地检索所有数据,但崩溃是我的问题 这是我的密码: #include<iostream> #include<conio.h> #include<windows.h> #include<fstream> using namespace std; void clrscr() { system("

我目前正在检查是否已检索到保存在“data.txt”中的数据,因此这是我仅有的accept函数代码。每次我在文件末尾,程序都会崩溃。我可以正确地检索所有数据,但崩溃是我的问题

这是我的密码:

#include<iostream>
#include<conio.h>    
#include<windows.h>
#include<fstream>

using namespace std;

void clrscr()
{
    system("cls");
}

struct node
{
    string data;
    struct node *yes;
    struct node *no;
};


node *pnode,*root;
int level=0;
struct node *add();
void accept();

int main()
{
    char ch,ch2;

    pnode=(node*)malloc(sizeof(node));
    pnode->yes=NULL;
    pnode->no=NULL;
    pnode->data="Do you love me?: ";

    root=(node*)malloc(sizeof(node));
    root=pnode;
    root->yes=NULL;
    root->no=NULL;
    root=pnode;
    accept();

    while(1)
    {
        clrscr();
        ch2='y';
        cout<<root->data;
        ch=getche();
        if(ch=='y')
        {
            root=root->yes;
            if(root==NULL)
            {
                cout<<"\nI got you !! ";
                root=pnode;

                cout<<"\n\nAnother Round?? [y/n]";
                ch2=getche();
                if(ch2=='n')
                break;
            }
        }

        else
        if(ch=='n')
        {

            if(root->no==NULL)
            {
                root->no=add();
                root=pnode;
                cout<<"\n\nAnother Round?? [y/n]";
                ch2=getche();
                if(ch2=='n')
                break;
            }
            else
             root=root->no;


        }

    }


}

struct node *add()
{
   clrscr();
   string str1,str2;
   node *nNode,*nNode2;
   cout<<"What's on your mind? : ";
   getline(cin,str1);
   cout<<"What question suits that thing? : ";
   getline(cin,str2);

   nNode=(node*)malloc(sizeof(node));
   nNode2=(node*)malloc(sizeof(node));

   nNode->data=str2;
   nNode2->data="Is it "+str1+"? ";

   nNode2->yes=NULL;
   nNode2->no=NULL;
   nNode->yes=nNode2;
   nNode->no=NULL;


    fstream File("data.txt", ios::out | ios::app);
    File<<nNode->data<<endl;
    File<<nNode2->data<<endl;

    File.close();

    fstream File1("level.txt", ios::out | ios::app);
    File1<<level<<endl;
    File1<<level+1<<endl;
    File1.close();

    fstream File2("branch.txt", ios::out | ios::app);
    File2<<level<<endl;
    File2<<level+1<<endl;
    File2.close();

    level++;

   return nNode;
}


void accept()
{
    string dat[256],dat1;
    int i=0,lvl[256],brnch[256],lvl1,brnch1;
    root=root->no;
    fstream file;
    file.open("data.txt", ios::in | ios::binary);
    while(file.good())
    {

       getline(file,dat1);
       cout<<dat1<<endl;
       getch();

    }
    file.close();

}
#包括
#包括
#包括
#包括
使用名称空间std;
void clrsc()
{
系统(“cls”);
}
结构节点
{
字符串数据;
结构节点*是;
结构节点*否;
};
节点*pnode,*root;
智力水平=0;
结构节点*add();
无效接受();
int main()
{
炭ch,ch2;
pnode=(node*)malloc(sizeof(node));
pnode->yes=NULL;
pnode->no=NULL;
pnode->data=“你爱我吗?”;
root=(node*)malloc(sizeof(node));
根=pnode;
root->yes=NULL;
root->no=NULL;
根=pnode;
接受();
而(1)
{
clrsc();
ch2='y';
库提斯;
if(root==NULL)
{

您不能检查代码中的分配是否成功,例如:

pnode=(node*)malloc(sizeof(node));
在这里,您为根分配了空间,但由于将根指向其他位置,因此该空间被浪费了:

root=(node*)malloc(sizeof(node));
root=pnode;
然后将root重新分配给pnode:

root=(node*)malloc(sizeof(node));
root=pnode;
root->yes=NULL;
root->no=NULL;
root=pnode;

这些仅仅是第一行。代码在很多方面都是错误的,你应该看看指针是如何工作的。

使用
new
分配节点,而不是
malloc
malloc
将不会调用构造函数,例如,导致字符串未初始化,这反过来会在你尝试分配时导致一些未定义的行为gn到.< /p> ,同时您也可以在C++代码中使用Maloc,这应该只保留给编写分配器或重载运算符new,当您想做的所有事情都是分配内存时。

在这种情况下,最大的问题是节点中有一个std::string,因此不能用C代码编写。它需要构造。您可以在这里使用malloc来分配内存,然后使用placement new,但除非您这样做是为了为大量节点预分配内存,否则这是不可取的在性能方面,还有一种替代方法,使用vector和reserve


我想现在不要使用MALOC,最好也使用某种C++集合来管理你的节点,因为你必须管理你分配的生命周期。< /P>崩溃是什么?异常。发布异常。需要更多信息。我注意到你正在调用Maloc但不释放内存。而且,分配根并立即覆盖iNoNE。对于标题中的所有大写字母,也请发布您收到的错误消息为什么要使用

malloc
进行常量大小分配?您应该声明为just
node which={“blah blah”,NULL,NULL}
谢谢,但现在我找到了问题的根源。谢谢你的所有评论谢谢。我现在知道什么时候分配内存了。我只想确保我创建的节点可以被访问,并防止我的程序因节点不为空而崩溃。但是这个问题会影响accept函数中文件的读取吗?这不会影响因为节点不是POD,所以无法工作。您需要:void*mem=malloc(sizeof(node));root=new(mem)node;(placement new)。然而,在这里使用placement new几乎肯定是错误的。我看到的答案的基本原理是:节点不是POD,因此除非出现新的布局,否则无法使用malloc。