【问题标题】:Using constructor in c++ to read from a file在 C++ 中使用构造函数从文件中读取
【发布时间】:2015-01-19 14:15:32
【问题描述】:

我正在尝试编写一个程序来打开一个文件并使用它来创建一个在我们的代码部分中称为“plansza”的表 我们必须定义一个构造函数

Plansza::Plansza(char * Nameoffile)

但是我们以后如何使用我们的文件名来实际打开它呢?在 int main() 中应该是

Plansza plansza("text.txt")

但这不起作用..

除此之外,我们还希望以后能够使用该表,例如更改一些数字或类似的东西..所以我们必须知道在哪里。 0

我们的示例文件 text.txt 如下所示

 0......0
 ...0....
 ...0....
 ...0....
 0......0

这是我们的代码..

class Plansza{
    private:
        int *ekran;
        int szer;
        int wys;
    public:
        Plansza();
        Plansza(int m,int n);
        Plansza(const Plansza &plansza);
        ~Plansza();
        Plansza& operator=(const Plansza& plansza);
        Plansza(char* NazwaPliku);
        void Wyswietl();
        int Szerokosc();
        int Wysokosc();
        void Set(int x,int y,int k);
        int Get(int x,int y);
    };

Plansza::Plansza(){
    ekran=new int[12];
    szer=4;
    wys=3;
    for (int i=0;i<szer*wys+1;i++)
        ekran[i]=0;
}
Plansza::Plansza(const Plansza &plansza){
    wys=plansza.wys;
    szer=plansza.szer;
    ekran=new int[wys*szer];
    for (int i=0;i<wys*szer+1;++i)
        ekran[i]=plansza.ekran[i];
}
Plansza::~Plansza(){
    delete []ekran;
}
Plansza& Plansza::operator=(const Plansza& plansza){
    if (&plansza==this)
        return *this;
    if (ekran != NULL)
        delete []ekran;
    szer=plansza.szer;
    wys=plansza.wys;
    ekran=new int[szer*wys];
    for (int i=0; i<szer*wys+1; i++)
        ekran[i]=plansza.ekran[i];
    return *this;
}
Plansza::Plansza(int m,int n){
    ekran=new int[m*n];
    szer=n;
    wys=m;
    for (int i=0;i<m*n+1;i++)
        ekran[i]=0;
}
Plansza::Plansza(char* NazwaPliku){
    FILE * plik;
    plik= fopen("Test.txt", "r");
    fclose(plik);
};
 void Plansza::Wyswietl(){
    for (int i=1;i<szer*wys+1;i++)
    {
        if (i%(szer)==0){
            if (ekran[i]==0)
                cout<< "." <<"";
            else
                cout<< "X" <<"";
            cout<< "\n" <<"";
        }
        else
        {
            if (ekran[i]==0)
                cout<< "." <<"";
            else
                cout<< "X" <<"";
        }
    }
};
int Plansza::Szerokosc(){
    return szer;
};
int Plansza::Wysokosc(){
    return wys;
};
void Plansza::Set(int x,int y,int k){
    if ((x>wys) || (y>szer) || (x<1) || (y<1))
        cout<<"Jestes poza tablica"<<"\n";
    else
        ekran[(x-1)*szer+y]=k;
}; 
int Plansza::Get(int x,int y){
if ((x<=wys) && (y<=szer)  && (x>=1) && (y>=1))
    return ekran[(x-1)*szer+y];
else
{
    cout<<"Jestes poza tablica"<<"\n";
    return 0;
}
};

【问题讨论】:

  • “但这不起作用”到底是什么意思?您可以将构造函数的参数复制到实例变量以供以后参考。
  • 作为旁注,you should not do actual work in your constructor,包括文件读取。
  • “但这不起作用..” - 到底出了什么问题? (对于现代编译器,您需要const char *(或std::string),而不是char *,并且您需要正确编写构造函数,而不仅仅是打开和关闭名称不同的文件提供。但除此之外,没有什么明显的错误)。
  • @Cyber​​:构造函数为什么不能完全初始化它?另一种方法是让它处于可怕的不死状态,直到您调用第二阶段初始化程序。在我看来,情况要糟糕得多。 (并且您链接中接受的答案与我一致。)
  • 使用向量,不再需要编写自己的析构函数、复制构造函数或赋值运算符。

标签: c++ file class constructor


【解决方案1】:

您忽略了NazwaPliku 参数,而是硬编码"Test.txt"。而是:

Plansza::Plansza(char* NazwaPliku){
    FILE * plik;
    plik= fopen(NazwaPliku, "r");
    fclose(plik);
};

如果您想稍后访问该文件,您需要将其存储在对象中的一个字段中。你已经有了ekran、szer 和wys,所以想必你知道该怎么做。

(现在我想学习波兰语,这样我就可以在我的代码中使用这些迷人的标识符...... :))

【讨论】:

    猜你喜欢
    • 2020-05-26
    • 2014-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多