bccwna 2019-12-12 15:19 采纳率: 0%
浏览 314

程序运行后txt文本出现乱

程序运行后文本文件出现乱码,四个warning是相同的问题, 看了很多帖子但都没有相关的详细回答

请问这种情况该如何解决

图片说明

图片说明
图片说明

#include<iostream>
#include<string.h>
#include<iomanip>
#include<fstream>
#include<stdio.h>
#include <stdlib.h>
using namespace std;
int count=0;
class CData   //定义数据基类
{
public:
    CData(){};
    virtual int Compare(CData &)=0;
    virtual void Show()=0;
    virtual ~CData(){};
};
class CNode   //定义结点基类
{
private:
    CData *pData;  //用于指向数据类的指针
    CNode *pNext;  //用于指向链表的后向指针
public:

    void InputData(CData *pdata){pData=pdata;}   //输入数据
    void ShowNode(){pData->Show();}             //打印一个节点的数据
    CData *GetData(){return pData;}
    friend class CList;    //定义链表类为基类
};
class CList
{

    CNode *pHead;    //链表头结点指针
public:
    CList(){pHead=0;};
    ~CList(){DeleteList();}
    void AddNode(CNode *pnode);   //在首部添加结点
    CNode *DeleteNode(CNode *);   //删除一个指定的结点,返回该结点的指针
    CNode *Search(CData &);     //查找一个指定的数据,返回该数据所在的结点在链表的指针,未找到返回0
    bool IsExist(CData &);
    void ShowList();            //打印整个链表
    void DeleteList();          //删除整个链表
    CNode *GetListHead(){return pHead;}   //返回链表首结点
    CNode *GetListNextNode(CNode *pnode);  //返回链表指定结点的下一个结点
};
CNode *CList::GetListNextNode(CNode *pnode)     //返回链表指定结点的下一个结点
{
    CNode *p1=pnode;
    return p1->pNext;
};
void CList::AddNode(CNode *pnode)   //在首部添加结点
{
    if (pHead==0)    //如果是空链表,插入的结点是唯一的结点
    {
        pHead=pnode;
        pnode->pNext=0;
        return;
    }
    else     //否则,插入到链表首部
    {
        pnode->pNext=pHead;
        pHead=pnode;
    }
};
CNode *CList::DeleteNode(CNode *pnode)     //删除一个指定的结点,返回该结点的指针
{
    CNode *p1,*p2;
    p1=pHead;              //指向首结点
    while(p1!=pnode&&p1->pNext!=0)    //寻找要删除的结点
    {
        p2=p1;
        p1=p1->pNext;       //结点p2始终在p1的后面
    }
    if (p1==pHead)       //如果要删除的是首结点
    {
        pHead=pHead->pNext;   //将首结点后移
        return pnode;
    }
    p2->pNext=p1->pNext;  //p1指向被删除的结点,将p2结点与p1后面的结点连接起来
    return pnode;
}
CNode *CList::Search(CData &data)   //查找一个指定的数据,返回指针,若未找到返回0
{
    CNode *p1=pHead;
    while(p1)                     //从头结点开始查找
    {
        if (p1->pData->Compare(data)==0)
            return p1;             //找到后返回结点指针
        p1=p1->pNext;
    }
    return 0;     //搜索完找不到,返回空指针0
}

void CList::ShowList()  //打印整个链表
{
    CNode *p1=pHead;
    while(p1)
    {
        p1->pData->Show();
        p1=p1->pNext;
    }


}
void CList::DeleteList()   //删除整个链表结点
{
    CNode *p1,*p2;
    p1=pHead;
    while(p1)
    {
        delete p1->pData;
        p2=p1;
        p1=p1->pNext;
        delete p2;
    }
}
class Repository:public CData   //库存为记录,为数据基类的公有派生类
{
private :
    char szName[20];     //库存中数据:商品名、商品数量和入库价格
    unsigned int szNumber;
    char szPrice[20];
    char szN;
    CList ShList;
public:
    Repository(); //构造函数
    Repository(char *name,int number,char *price);
    void SetRecord(char *name, int number,char *price);    //输入数据函数
    int Compare(CData &);   //比较函数,比较商品名
    void Show();
    void AddRecord();
    void Display();
    void LookUpRecord();
    void DeleteRecord();
    void ModifyRecord();
    void SaveToFile();
    void Operate(string &strChoice);
    void ReadFromFile();
    void Output();
};
Repository::Repository()
{
    strcpy(szName,"\0");
    szNumber=0;
    strcpy(szPrice,"\0");
}

Repository::Repository(char *name,int number,char *price)
{
    strcpy(szName,name);
    szNumber=number;
    strcpy(szPrice,price);
    szN=name[0];
}
void Repository::SetRecord(char *name, int number,char *price)    //输入数据函数
{
    strcpy(szName,name);
    szNumber=number;
    strcpy(szPrice,price);
    szN=name[0];
}
int Repository::Compare(CData &data)  //比较商品名
{
    Repository &temp=(Repository &)data;

        return strcmp(szName,temp.szName);


}
void Repository::Show()  //打印一个结点的数据
{
    cout<<setw(15)<<szName<<setw(15)<<szNumber<<setw(15)<<szPrice<<endl;
}

void Repository::AddRecord()   //将记录添加到链表中
{
    CNode *pNode;
    Repository *pSh;
    char szName[20],szPrice[20];
    unsigned int szNumber;
    cout<<"请输入新商品名(输入0退出,并进入系统菜单):";
    cin>>szName;
    while(strcmp(szName,"0"))
    {
        cout<<"请输入新商品入库价格: ";
        cin>>szPrice;
        cout<<"请输入新商品数量:  ";
        cin>>szNumber;
        pSh=new Repository;                           //生成新的数据累对象
        pSh->SetRecord(szName,szNumber,szPrice);       //数据类对象赋值
        pNode=new CNode;                           //生成新的结点
        pNode->InputData(pSh);                     //结点插入链表
        ShList.AddNode(pNode);
        count++;
        cout<<"请输入新商品名(输入0退出,并进入系统菜单) ";
        cin>>szName;
    }
    cout<<endl<<endl;
}

void Repository::Display()                     //显示全部链表数据
{
    cout<<"当前操作共有"<<count<<"条新商品的添加纪录。\n\n";
    cout<<"目前库存共有商品信息记录是:\n\n";
    cout<<setiosflags(ios_base::left)<<setw(15)<<"商品名"<<setw(15)<<"商品数量"<<setw(15)<<"入库价格"<<endl<<endl;
    ShList.ShowList();
    cout<<endl<<endl;
    system("pause");
    system("cls");
}

void Repository::LookUpRecord()        // 按照商品名查找
{
    CNode *pLook;
    char szName[20];
    cout<<"请输入您需要查找的商品名(输入0退出,并进入系统菜单):";
    cin>>szName;
    while (strcmp(szName,"0"))
    {
        Repository sh(szName,0,"0");    //生成结点
        pLook=ShList.Search(sh);         //查找指定结点的数据
        if (pLook)
        {
            cout<<"在库存商品信息记录中找到商品:"<<szName<<",内容是:"<<endl;
            cout<<setw(15)<<"商品名"<<setw(15)<<"商品数量"<<setw(15)<<"入库价格"<<endl;
            pLook->ShowNode();
        }
        else
            cout<<"在库存商品信息记录中找不到商品:"<<szName<<"。"<<endl;
        cout<<"请输入您需要查找的商品名(输入0退出,并进入系统菜单):";
        cin>>szName;
    }
    cout<<endl<<endl;
}
void Repository::DeleteRecord()   //在链表中删除指定的结点的数据
{
    CNode *pLook;
    char szName[20];
    cout<<"请输入您需要删除的商品名(输入0退出,并进入系统菜单):";
    cin>>szName;
    while(strcmp(szName,"0"))
    {
        Repository sh(szName,0,"0");
        pLook=ShList.Search(sh);
        if (pLook)      //删除时应先查找出结点
        {
            cout<<"在库存商品信息记录中找到商品:"<<szName<<",内容是:"<<endl;
            cout<<setw(15)<<"商品名"<<setw(15)<<"商品数量"<<setw(15)<<"入库价格"<<endl;
            pLook->ShowNode();
            cout<<"请确定是否删除此商品信息记录(Y/N)【确定删除请输入Y或y,取消删除请输入N或n】:";
            char ok;
            cin>>ok;
            if (ok=='Y'||ok=='y')
            {
                ShList.DeleteNode(pLook);
                cout<<szName<<"的信息记录删除成功!"<<endl;
                delete pLook;
                count--;
            }
            else if(ok=='N'||ok=='n')
                cout<<szName<<"的信息记录删除失败!"<<endl;
        }
        else
            cout<<"在库存商品信息记录中找不到商品:"<<szName<<"。"<<endl;
        cout<<"请输入您需要删除的商品名(输入0退出,并进入系统菜单):";
        cin>>szName;
    }
    cout<<endl<<endl;
}
void Repository::ModifyRecord()    //修改商品记录
{
    CNode *pLook;
    Repository *pSh;
    char szName[20],szPrice[20];
    unsigned int szNumber;
    cout<<"请输入您需要修改的商品名(输入0退出,并进入系统菜单):";
    cin>>szName;
    while(strcmp(szName,"0"))
    {
        Repository sh(szName,0,"0");
        pLook=ShList.Search(sh);
        if (pLook)         //修改时应先查找出结点
        {
            cout<<"在库存商品信息记录中找到商品:"<<szName<<",内容是:"<<endl;
            cout<<setw(15)<<"商品名"<<setw(15)<<"商品数量"<<setw(15)<<"入库价格"<<endl;
            pLook->ShowNode();
            cout<<"-----下面开始修改-----"<<endl<<"请输入修改后的商品名:  ";
            cin>>szName;
            cout<<"请输入修改后的商品数量:";
            cin>>szNumber;
            cout<<"请输入修改后的商品入库价格: ";
            cin>>szPrice;
            cout<<"请确定是否修改此记录(Yes (Y) or No(N)):";
            char ok;
            cin>>ok;
            if (ok=='Y'||ok=='y')
            {
                pSh=new Repository;
                pSh->SetRecord(szName,szNumber,szPrice);
                pLook->InputData(pSh);
                cout<<szName<<"的信息记录修改成功!"<<endl;
            }
            else if(ok=='N'||ok=='n')
                      cout<<szName<<"的信息记录修改失败!"<<endl;
        }
        else
            cout<<" 在库存商品信息记录中找不到"<<szName<<","<<endl;
           cout<<"  请输入您需要修改的商品名(输入0退出,并进入系统菜单):";
           cin>>szName;
    }
}
void Repository::Output()
{
    CNode *pLook;
    Repository *pSh;
    char szName[20];
    unsigned int szNumber;
    cout<<"请输入您需要出库的商品名(输入0退出,并进入系统菜单):";
    cin>>szName;
    while(strcmp(szName,"0"))
    {
        Repository sh(szName,0,"0");
        pLook=ShList.Search(sh);
        if (pLook)         //修改时应先查找出结点
        {
            pSh=(Repository *)pLook->GetData();
            cout<<"在库存商品信息记录中找到商品:"<<szName<<",内容是:"<<endl;
            cout<<setw(15)<<"商品名"<<setw(15)<<"商品数量"<<setw(15)<<"入库价格"<<endl;
            pLook->ShowNode();
            if (0==pSh->szNumber)
            {
                cout<<"该商品缺货,请及时补充!"<<endl;
            }
            else
            {
                cout<<"请输入您要取出的商品数量:";
                cin>>szNumber;
                cout<<"请确定是否取出该商品( Yes (Y)  or  No(N)   ):";
                char ok;
                cin>>ok;
                if(ok=='Y'||ok=='y')
                {
                    if(pSh->szNumber<=szNumber)
                    {
                        cout<<szName<<"您要求的商品数量大于仓库中的数量,故全部输出"<<pSh->szNumber<<" 个商品"<<endl;
                        pSh->szNumber=0;
                    }
                    else
                    {
                        pSh->szNumber-=szNumber;
                        cout<<szName<<"您已取出 "<<szNumber<<" 个商品"<<endl;
                    }
                    cout<<szName<<"成功取出!"<<endl;

                }
                else
                    if(ok=='N'||ok=='n')
                        cout<<szName<<"您取消了该操作"<<endl;
            }

        }
        else
            cout<<" 在库存商品信息记录中找不到"<<szName<<","<<endl;
        cout<<"  请输入您需要出库的商品名(输入0退出,并进入系统菜单):";
        cin>>szName;
    }
}
void Repository::SaveToFile()   //将链表中的数据保存在文件中
{
    ofstream outfile("repository.txt",ios::binary);
    if(! outfile)
    {
        cout<<"数据文件打开错误,没有将数据存入文件!\n";
        return;
    }
    CNode *pnode;
    Repository *pSh;
    string strName,strNumber;
    pnode=ShList.GetListHead();   //取出链表首结点指针
    while(pnode)
    {
        pSh=(Repository *)pnode->GetData();    //返回结点指向的数据域指针
        outfile.write((char *)pSh,sizeof(Repository));  //将数据域写入文件
        pnode=ShList.GetListNextNode(pnode);    // 取下一结点的指针
    }
    outfile.close();
}
void Repository::ReadFromFile()  //在程序开始先查找有无数据文件,找到后读取文件数据
{
    ifstream infile("repository.txt",ios::binary);
    if(! infile)
    {
        cout<<"没有数据文件,请您先添加!\n\n";
        return;
    }
    CNode *pNode;
    Repository *pSh;
    while(! infile.eof())
    {
        pSh=new Repository;   //定义数据域对象
        infile.read((char *)pSh,sizeof(Repository));
        pNode=new CNode;
        pNode->InputData(pSh);   //数据域对象内容生成结点
        ShList.AddNode(pNode);    //将结点加入链表
    }
    ShList.DeleteNode(pNode);    //由于文件多读一次,所以将首结点删除
    infile.close();
}
void Repository::Operate(string &strChoice)   //根据主菜单选项进行操作
{
    if (strChoice=="1")
        AddRecord();
    else if (strChoice=="2")
        Display();
    else if (strChoice=="3")
        LookUpRecord();
    else if (strChoice=="4")
        DeleteRecord();
    else if(strChoice=="5")
        ModifyRecord();
    else if(strChoice=="6")
        Output();
    else if (strChoice=="0")
        SaveToFile();
    else cout<<"对不起,您的输入有误,请重新输入您的选择:  ";
}
int main()
{
    Repository repository;
    cout<<"*******************************************************************\n\n";
    cout<<"             欢迎进入库存管理系统                  \n\n";
    cout<<"*******************************************************************\n\n";
    repository.ReadFromFile();   //从文件中输入数据
    string strChoice;   //接受主菜单选项
    do
    {
        cout<<"【欢迎进入系统菜单】:\n\n\n";
        cout<<"      <1>.添加新商品信息记录\n\n";
        cout<<"      <2>.显示库存中商品信息记录内容\n\n";
        cout<<"      <3>.根据商品名查询库存中商品信息记录\n\n";
        cout<<"      <4>.根据商品名删除库存中商品信息记录\n\n";
        cout<<"      <5>.根据商品名修改库存中商品信息记录\n\n";
        cout<<"      <6>.商品出库\n\n";
        cout<<"      <0>.退出系统\n\n\n";
        cout<<"【请输入您的选择】:";
        cin>>strChoice;
        system("cls");
        repository.Operate(strChoice);
    }while(strChoice!="0");
    cout<<"***********************************************************************\n\n";
    cout<<"        ------------******欢迎再次使用库存管理系统******----------     \n\n";
    cout<<"***********************************************************************\n\n";
    system("pause");
}

  • 写回答

2条回答 默认 最新

  • J4cks0n 2019-12-12 16:08
    关注

    warning问题
    Repository sh(szName,0,"0"); 改成 Repository sh(szName,0,(char*)"0");

    还有一个 程序实际有问题的
    Repository::ReadFromFile再改改吧
    这么多new竟然没看到几个delete

    评论

报告相同问题?

悬赏问题

  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 file converter 转换格式失败 报错 Error marking filters as finished,如何解决?
  • ¥15 ubuntu系统下挂载磁盘上执行./提示权限不够
  • ¥15 Arcgis相交分析无法绘制一个或多个图形
  • ¥15 关于#r语言#的问题:差异分析前数据准备,报错Error in data[, sampleName1] : subscript out of bounds请问怎么解决呀以下是全部代码:
  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误