谭浩强是为了大陆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,你得明白这两者的区别,虽然对于这种内建类型,编译器会优化得一样。但“返回原先的值”对你的代码逻辑而言是没必要的,没必要的就不应当存在
最后,我只是泛泛而谈,很多地方没有解释为什么,估计你看得也稀里糊涂,但你迟早会遇到,自然而然的懂的