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;
}

//为什么第一个构造函数可以正常使用,后两个就不可以了呢?
展开
 我来答
heresy_me
2014-05-13 · TA获得超过1719个赞
知道小有建树答主
回答量:1708
采纳率:42%
帮助的人:307万
展开全部
#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); // 恢复位置
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
xoaxa
2014-05-12 · TA获得超过8611个赞
知道大有可为答主
回答量:6415
采纳率:72%
帮助的人:3501万
展开全部
Time(const char *s):datafile("s",ios::in) // 把分号去掉
Time(ifstream f):datafile("f",ios::in) // 同样的问题。
追问
本来就没有分号啊
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式