_Phoebe__ 2022-04-12 04:29 采纳率: 96.9%
浏览 45
已结题

这个为什么是open error啊 想知道哪里错了怎么改


#include<bits/stdc++.h>
#include <fstream>
#include <algorithm>    // std::sort
using namespace std; 
class AbsCollection{
protected:
    int *iPtr;        //指向数组的指针
    int last;        //数组最后一个元素的位置
    int maxSize;    //数组总体长度
public:
    AbsCollection(int size = 100){
        maxSize = size;
        iPtr = new int[maxSize];
        last = -1;
    };
    virtual ~AbsCollection() {};
    void OutputSet();  //输出集合中元素
};
 
void AbsCollection::OutputSet()
{
    cout<<"The number of elements:"<<last+1<<endl;
    for(int i=0;i<=last;i++)
    {
        cout<<iPtr[i]<<" ";
    }
    cout<<endl;
}
class Set:public AbsCollection
{
private:
    char *fileName; //存放数据的文件
public:
    Set(int size = 100, const char *szFileName="");//从文件读取数据存入数组(要判断是否有重复元素)
    virtual ~Set();        //析构函数,释放内存并将数据写入文件
    void insert(int x);    
    void erase(int x);
    int isInSet(int x);     //判断x是否已经存在于集合中
    friend ostream& operator<<(ostream& os, Set& s);
    void intersetion(Set &s);//求集合的交(*this与s的交,结果放在*this中)
    void operator+(Set &s);     //求集合的并(*this与s的并,结果放在*this中)
    void diff(Set &s);         //求集合的差(*this与s的差,结果放在*this中)
    Set& operator=(Set &s);  //赋值拷贝函数
    void sort();             //将集合中元素从大到小排序
};
 
int Set::isInSet(int x)
{
    int flag = 0;
    for(int i=0; i<last+1; i++)
    {
        if(x==iPtr[i])
            flag = 0;
        else
            flag = 1;
    } 
    return flag; 
}
void Set::insert(int x)
{
    if(!isInSet(x)){
        if(last+1<maxSize){
            iPtr[++last]  =  x; 
        }
        else{
            Set tempSet(maxSize+1);
            for(int i = 0;i<= last;i++){
                tempSet.iPtr[i] = iPtr[i];
                tempSet.last++;
            }
            delete []iPtr;
            last = -1;
            iPtr = new int[++maxSize];
            for(int i = 0;i<= tempSet.last;i++){
                iPtr[i] = tempSet.iPtr[i];
                last++;
            }
            last++;
            iPtr[last] = x;
        }
    }
}
Set::Set(int size, const char *szFileName):AbsCollection(size)
{   
    if(szFileName =="")
    {
        fileName=NULL;
        return;
    }
    fileName = new char[strlen(szFileName)];
    fstream fs(szFileName,ios::in);
    if(!fs.is_open())
    {
        cout<<"open error!"<<endl;
        abort();
    } 
    int x;
    while(fs>>x)
    {
        if(!isInSet(x))
        {
            insert(x);
        }
    }
    fs.close();
}
Set::~Set()
{    
    if(fileName)
    {
        fstream fs(fileName,ios::out|ios::trunc);
        for(int *ip=iPtr;ip<=iPtr+last;)
        {
            fs<<*ip++<<" ";
        }
        fs.close();
        delete fileName;
    }
    if(iPtr)
    {
        delete []iPtr;
    }
}
void Set::erase(int x)
{
 
    for(int i = 0;i<=last;i++){
        if(iPtr[i]==x){
            break;
        }
        if(i<=last){
            while(i!=last){
                iPtr[i]=iPtr[i++];
            }
        }
    }
    last--;
}
ostream& operator<<(ostream& os, Set& s)
{
 
    for(int i = 0;i<=s.last;i++)
    {
        os<<s.iPtr[i]<<" ";
    }
    return os;
}
void Set::intersetion(Set &s)
{
    Set tempSet(maxSize);
    for(int i = 0;i<=last;i++)
    {
        if(s.isInSet(iPtr[i]))
        {
            tempSet.insert(iPtr[i]);
        }
    }
    *this = tempSet;
}
void Set::operator+(Set &s){
    for(int i=0;i<=s.last;i++){
        if(!isInSet(s.iPtr[i])){
            insert(s.iPtr[i]); 
        } 
    }
}
void Set::diff(Set &s)
{
    Set tempSet(maxSize);
    tempSet = *this;
    for(int i=0;i<=s.last;i++)
    {
        if(isInSet(s.iPtr[i]))
        {
            tempSet.erase(s.iPtr[i]);
        }
    }
    *this = tempSet;
 
}
Set& Set::operator=(Set &s)
{
    if(iPtr) delete []iPtr;
    maxSize = s.maxSize;
    iPtr = new int[maxSize];
    last = s.last;
    for(int i=0;i<=last;i++)
    {
        iPtr[i]=s.iPtr[i];
    }
    return *this;
} 
void Set::sort()
{
    std::sort(iPtr,iPtr+last+1,greater<int>());
}
int main()
{
    Set set1(0,"f1.txt");
    set1.insert(30);
    set1.OutputSet();
}
 
 

展开全部

  • 写回答

4条回答 默认 最新

  • 关注

    fstream fs(szFileName, ios::in);这里,szFileName是绝对路径吗?
    (1)文件必须要存在
    (2)如果szFileName是绝对路径,检查路径是否正确,如果路径正确,尝试把路径中的\改成 /
    (3)如果是相对路径,文件需要跟代码在一个文件夹下。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)
编辑
预览

报告相同问题?

问题事件

  • 系统已结题 4月23日
  • 已采纳回答 4月16日
  • 创建了问题 4月12日
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部