程序运行后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");
}

c++

2个回答

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

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

设置下编译器的字符编码

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问

相似问题

5
微信小程序富文本解析
2
Python读取txt文本文件数据插入到数据库中,数据库中只有txt中最后一行数据
0
《Java EE 程序设计》作者:郝玉龙 书中程序3-18运行代码后,结果是错的
1
微信小程序本页面的文本信息如何在另一个页面显示
1
请问,为什么程序可以运行,文本也可以建立但是却无法输入内容?
1
怎么批量在txt文件头部添加文本并换行?
5
什么工具都没有,怎么批量在txt头部添加文本
3
vs2010 MFC 求处理txt文本文件的后1000个字符的代码。
1
WPF文本框改变内容后为什么会触发两次TextChange事件?
1
求大神帮忙用xlsx宏编写将xlsx1-N列的内容批量生成至TXT文本
3
怎么实现将txt文本拖拽至窗口界面中?
1
超文本链接在iframe内联框架中运行多次后会跳出到一个新的页面去显示链接是为什么?
2
前端:求富文本或者markdown编辑器生成后的HTML内容比对功能的插件.
2
c++题目求解!!读取文本并计算单词数
0
python:从已知文本文件"in.txt"中读取存放有若干整数,请将其按照从小到大的顺序排列后存入另一文件"out.dat"。
1
vba 在word 中如何让文本控件获得焦点?setFocus用不了。出现“对象不支持该属性或方法”
1
python如何处理CSV数据转换为txt。并且一行一个文本
1
UMEditor富文本自定义上传图片后删除富文本内图片怎么删除服务器端资源
1
fprintf输出到文本之后会有一串代码结束。
2
openOffice doc转换pdf 出现MERGEFIELD文本