C++在构造函数中打开文件的问题
#include<iostream>#include<fstream>#include<iomanip>usingnamespacestd;classTime{priva...
#include<iostream>
#include<fstream>
#include<iomanip>
using namespace std;
class Time
{
private:
int hour;
int minute;
int second;
fstream datafile;
ofstream ofile;
public:
Time():datafile("d:\\mydatafile.txt",ios::in)
{
if(!datafile)
{
cout<<"can not open source file"<<endl;
}
datafile >> hour >> minute >> second;
}
Time(const char *s):datafile("s",ios::in) //文件名从参数提供
{
if(!datafile)
{
cout<<"can not open source file"<<endl;
}
datafile >> hour >> minute >> second;
}
Time(ifstream f):datafile("f",ios::in) //文件对象从参数提供
{
if(!datafile)
{
cout<<"can not open source file"<<endl;
}
datafile >> hour >> minute >> second;
}
~Time()
{
ofile.open("d:\\myfile.txt",ios::out);
ofile<<hour<<minute<<second;
ofile.close();
}
void print()
{
cout<<hour<<minute<<second;
}
};
int main()
{
Time a("d:\\mydatafile.txt");
a.print ();
return 0;
}
//为什么第一个构造函数可以正常使用,后两个就不可以了呢? 展开
#include<fstream>
#include<iomanip>
using namespace std;
class Time
{
private:
int hour;
int minute;
int second;
fstream datafile;
ofstream ofile;
public:
Time():datafile("d:\\mydatafile.txt",ios::in)
{
if(!datafile)
{
cout<<"can not open source file"<<endl;
}
datafile >> hour >> minute >> second;
}
Time(const char *s):datafile("s",ios::in) //文件名从参数提供
{
if(!datafile)
{
cout<<"can not open source file"<<endl;
}
datafile >> hour >> minute >> second;
}
Time(ifstream f):datafile("f",ios::in) //文件对象从参数提供
{
if(!datafile)
{
cout<<"can not open source file"<<endl;
}
datafile >> hour >> minute >> second;
}
~Time()
{
ofile.open("d:\\myfile.txt",ios::out);
ofile<<hour<<minute<<second;
ofile.close();
}
void print()
{
cout<<hour<<minute<<second;
}
};
int main()
{
Time a("d:\\mydatafile.txt");
a.print ();
return 0;
}
//为什么第一个构造函数可以正常使用,后两个就不可以了呢? 展开
展开全部
#include <iostream>
#include <fstream>
class Time {
int hour, minute, second;
void getf_helper(std::ifstream&);
friend void print(const Time&);
public:
Time(const char* s=0) :hour(),minute(),second() { std::ifstream f(s ? s:"d:/mydatafile.txt"); getf_helper(f); }
Time(std::ifstream& f) :hour(),minute(),second() { getf_helper(f); }
~Time() { std::ofstream o("d:/myfile.txt"); o<<hour<<' ' << minute<< ' ' << second << '\n'; }
};
void Time::getf_helper(std::ifstream& f) { if (f>>hour>>minute>>second) return; std::cerr<<"Can't open source\n"; }
void print(const Time& t) { std::cout << t.hour << ':' << t.minute << ' ' << t.second <<'\n'; }
int main() { Time tm("d:/mydatafile.txt"); print(tm); return 0; }
更多追问追答
追问
嗯嗯 您的是可以编出来 但是我看不懂啊。。。能不能看看我的是错在哪里?
追答
对照于我的const char* s初始化ifstream时不需加“”这对双引号,楼下把引号讲成分号被楼抓字眼。
Time(ifstream f) :datafile("f")不止只因加了“”双引号,而且ifstream不能复制,所以要写成像我这样的
Time(std::ifstream& f),然后f也不能用来初始化你自己的fstream,因为这样等于以复制来初始化,也不行,所以一定要是引用。所以你看到我直接只有hour,minute,second这些成员,且从文件里读了数据后这个ifstream、ofstream写完数据就没用了,没必要把它被为成员的。其实我还想改变我上面的代码,因为Time(std::ifstream& f)从f里面读数据,就会改变以了f的数据指针,我认为不应这样做,我想把它改成:
Time(std::ifstream& f) :hour(),minute(),second() {
std::ifstream::pos_type prepos=f.tellg(); // 保存原来的数据位置
f.seekg(0); // 定位到文件开始的位置
getf_helper(f);
f.seekg(prepos); // 恢复位置
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询