ПРОГРАММА ПРОИСХОДИТ, ЧИТАЯ ФАЙЛ C ++ - PullRequest
0 голосов
/ 01 марта 2012

В настоящее время я проверяю, получил ли я данные, сохраненные в «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();

}

Ответы [ 3 ]

1 голос
/ 01 марта 2012

Используйте new для выделения узла, а не malloc.malloc не будет вызывать ctors, вызывая, например, инициализацию строк, что, в свою очередь, вызывает довольно неопределенное поведение при попытке назначить ему.

1 голос
/ 01 марта 2012

Вы не проверяете, успешно ли выделены ресурсы в вашем коде, например:

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;

И это только первые строки. Код неправильный во многих отношениях, вы должны взглянуть на то, как работают указатели.

0 голосов
/ 01 марта 2012

Хотя вы можете использовать malloc и в коде C ++, это должно быть зарезервировано только для написания распределителей или операторов перегрузки new, когда все, что вы хотите сделать, это выделить память.

В этом случае большая проблема заключается в том, чтоВ узле есть std :: string, поэтому он не может быть записан с кодом C как таковым.Это нуждается в строительстве.Здесь вы можете использовать malloc для выделения памяти, а затем использовать размещение-новое, но если вы не делаете это для предварительного выделения памяти для большого количества узлов, это не очень рекомендуется.Если вы собираетесь сделать это для повышения производительности, в любом случае есть альтернатива - использовать вектор с резервом.

Я полагаю, что на данный момент не используйте malloc, а предпочтительно также используйте какой-нибудь набор C ++ для управления вашими узлами., так как вы должны управлять временем жизни тех, кого вы выделяете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...