注册 登录
编程论坛 C++教室

表达式必须包含bool类型(或可转换成bool)

锋了 发布于 2012-12-13 20:29, 4513 次点击
ofstream outfile;
    string filename;
    cout<<"Please enter a file name:";
    cin>>filename;

if(!outfile.open("filename",ios::binary))
老说outfile"表达式必须包含bool类型(或可转换成bool)",是怎么回事呢??
12 回复
#2
wp2319572012-12-13 20:31
outfile.open  看下他的返回值的类型是否是bool
#3
锋了2012-12-13 20:36
C++刚学到读写文件,还真不怎么懂,以下是完整子函数
void savedata(Student*s[],int n)
{
    ofstream outfile;
    string filename;
    int i;
    cout<<"Please enter a file name:";
    cin>>filename;
    if(!outfile.open("filename",ios::binary))
    {
        cerr<<"Open file error!"<<endl;
        getch();
        exit(1);
    }
    for(i=0;i<n;i++)
        outfile.write((char*)s[i],sizeof(s));
    outfile.close();

}



如果改成这样就不会报错
outfile.open("filename",ios::binary);
if(!outfile)
     {
        cerr<<"Open file error!"<<endl;
        getch();
        exit(1);
    }


[ 本帖最后由 锋了 于 2012-12-13 21:01 编辑 ]
#4
锋了2012-12-13 22:06
没人回答吗??
#5
rjsp2012-12-14 08:59
if(!outfile.open("filename",ios::binary))
--- outfile.open的返回类型是void,你 if( !void ) 是何意思?

看3楼代码,我强烈建议你先歇歇,忘掉已学的错误知识,然后换书换老师。
虽然我的建议可能令你不快,但良药苦口,在错误的道路上学废了更可惜
#6
锋了2012-12-14 10:07
回复 5楼 rjsp
版主,三楼就是我啊!
按照版主意思是我的书有问题咯,我先在用的是谭浩强编著的,他编的书可以用吗?
#7
mmmmmmmmmmmm2012-12-14 10:33
版主已经解释清楚了  

open
语法:
  void open( const char *filename );
  void open( const char *filename, openmode mode );

对于文件的打开 可以看如下:
只有本站会员才能查看附件,请 登录
#8
rjsp2012-12-14 10:57
谭浩强是为了大陆C/C++作出巨大贡献的人,在缺乏学习和参考资料的年代,凭着摸索和猜测写出了C/C++教科书
但猜测毕竟不标准,闭门造车容易走上歪路。我建议你怀着对谭浩强的敬意的同时选择一本不是谭浩强编写的书籍

void savedata(Student*s[],int n)
------ Student*s[]估计是你手误,应该是 Student s[] 或 Student* s;但如果不是手误,那就有问题,滥用指针是Javar的标准行为(虽然Java不叫“指针”,并说Java没有指针),但却是C++中的陋习
------ n使用int类型不好,应当为size_t。原因有两点 a. n不可能不应该为负值; b. 对于尺寸,为了确保可移植性,不应该使用不确定类型

将函数中需要的变量在函数开始处声明,是一种古老的不合时宜的做法(当初CPU速度慢,为了加快编译速度才不得不如此规定),在C++中,包括现在的C中,不建议你这么做,尤其是在C++中,某些场合甚至无法这么做。应当在需要的时刻才定义变量,即
    cout<<"Please enter a file name:";
    string filename;
    cin>>filename;
    ofstream outfile( filename, ios::binary );
    if( outfile )
        ……
    for( int i=; ……

open("filename" 估计是你手误,应当是 open( filename

cerr 是不带缓冲的,不需要flush,所以应当是 cerr<<"Open file error!\n";

程序运行结束前写 getch() 是一种陋习(如果仅仅是为了调试,那当然可以),没有哪个控制台程序,包括控制台命令,需要按一键才退出。
   
不要用exit(只是一般情况下),一个合格的代码应当将错误状态返回给调用者,而不是自己一抹脖子就自杀了。尤其是在C++中,C++中还需要调用析构函数

将输入文件名这个动作,和保存文件这个动作放在同一个函数中是不良设计。保存文件是一个固定的动作,但获取文件名可能是从控制台输入,可能是从配置文件获得,可能来自于网络……

i++ 当写成 ++i,你得明白这两者的区别,虽然对于这种内建类型,编译器会优化得一样。但“返回原先的值”对你的代码逻辑而言是没必要的,没必要的就不应当存在

最后,我只是泛泛而谈,很多地方没有解释为什么,估计你看得也稀里糊涂,但你迟早会遇到,自然而然的懂的
#9
shmilyflf2012-12-14 20:51
回复 8楼 rjsp
版主威武啊!
#10
bccn_822012-12-14 22:53
版主V5啊!
#11
mmmmmmmmmmmm2012-12-14 23:21
版主威武
#12
qunxingw2012-12-14 23:50
学习,难能可贵
#13
锋了2012-12-15 10:38
回复 8楼 rjsp
版主利害,严重受教了!!!
但有一点问题,就是你提出的 “Student*s[]估计是你手误,应该是 Student s[] 或 Student* s”,如果写成Student* s的话
这一步是有问题的
for(i=0;i<n;i++)
    outfile.write((char*)s[i],sizeof(s));  //不存在student 到char* 的转化

第二
“i++ 当写成 ++i”的问题,我理解没错i++是用后在自增,++i是用前自增,
如果是
for(i=0;i<n;i++)cin<<a[i];

的话,那不是不能输入a[0]了吗?
1