-
1. 基础练习 (1)教材习题 11-7 (2)教材习题 11-3 (3)教材习题 11-4
2. 应用练习 (1)已知有班级名单文件 list.txt(见实验 7 附件包)。编写一个应用程序实现随机抽点 5 位同学,在屏幕上显示结果,同时,也将结果写入文件 roll.txt。 ① 编写程序实现题目基本功能要求。(必做) ② ******选做******) 对①中实现的基本功能进行完善、扩充,使得这个点名应用程序更灵活、更方便。比如: a) 从键盘输入班级文件名,支持对不同班级的点名操作; b) 从键盘输入用于保存点名结果的文件名。更灵活地,自动获取当前系统日期作为文 件名,比如 20180612.txt。(如果希望更细粒度,文件名可以到小时和分钟这一层级); c) 随机抽点人数不固定,通过键盘按键控制何时抽点结束; d) 通过菜单及程序的函数模块划分,或类的设计与实现,做成一个更完善的应用,等 等。 (2)统计英文文本文件字符数、单词数、行数,文件名由键盘输入。 ① 编写 C++程序实现题目基本功能要求。(必做) ② ******选做****** a) 提供菜单,由用户选择统计内容; b) 思考当文本内容数量级偏大,①处已实现的程序能否胜任,实现快速统计?在算法 和处理逻辑上是否存在进一步改进的部分?
- 解答:
- 11-3
#include<iostream>
#include<fstream>
using namespace std;
int main(){
ofstream out("test1.txt");
if(!out) {
cout << "fail to open." << endl;
return ;
}
out<<"已成功写入文件!"<<endl;
out.close(); return ;
} -
11-4:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main() { string s;
ifstream in("test1.txt");
if(!in) {
cout << "fail to open." << endl;
return ;
}
in >> s;
cout << s;
in.close();
return ;
} -
11-7
// p510, ex11-7
#include <iostream>
using namespace std; int main() { ios_base::fmtflags original_flags=cout.flags();//保存现在的参数设置 cout << << '|';
cout.setf(ios_base::left, ios_base::adjustfield);//输出左对齐 cout.width();//设置域宽,但是只对第一个输出起作用
cout << << << '\n'; cout.unsetf(ios_base::adjustfield);//清除左对齐格式
cout.precision();// 两位浮点数
cout.setf(ios_base::uppercase|ios_base::scientific);// 科学计数法
cout << 831.0;
cout.flags(original_flags); // 恢复原来的格式设置 return ;
} - 这道题我分别采用三种方式读入老师所给的文件,但是读不进来。测试输出的都是空格乱码。我将list.txt文件和代码放在同一目录下,但是,就是读入不了啊。然后我就自己新写了一个test1.txt文件,可以正常读取输出。老师所给的文件有什么特殊输入,特殊字符吗?一定要文件读入这个list.txt文件是不是在考查哪个知识?遗憾的是,我并没有成功读入文件啊!!!下面给出我自己创建的文件运行
#include<iostream>
#include<string>
#include<cstdlib>
#include<fstream>
using namespace std;
struct student{
string order;
string xuehao;
string name;
string classname;
};
int main(){
student s[];
ifstream infile("test1.txt");
if(!infile) //测试是否成功打开
{
cerr<<"open error!"<<endl;
return ;
}
/*利用行读取来获取文件信息*/
/*int i=0;
char c[83]; while(!infile.eof()){
infile.getline(c,83);
cout<<c[i]<<endl;
i++;
}
infile.close(); //利用行读入进行文件读取*/ /*仿照课件员工工资读取方式读取*/
/* while(!infile.eof())
{
infile.read(reinterpret_cast<char*>(&s), sizeof(s)); //只有二进制才能这样读取吗?
if(infile) {
cout << s.order << " " << s.xuehao << endl;
}
}
infile.close(); */ int i=;
while(infile>>s[i].order>>s[i].xuehao>>s[i].name>>s[i].classname)
{
i++;
}
infile.close();
int a=;
ofstream out("roll.txt");
for(int i=;i<=;++i)
{
a=rand()%i+;
cout<<s[a].order<<" "<<s[a].xuehao<<" "<<s[a].name<<" "<<s[a].classname<<endl;
out<<s[a].order<<" "<<s[a].xuehao<<" "<<s[a].name<<" "<<s[a].classname<<endl;
}
out.close(); return ;
}最后的蓝色部分也是一行输出,由于我定义的s数组为100,但是文件里面只有5个名字,所以输出了其中没有值的一项。
- 写入的文件截图如下
- :
- 利用实验七里面的list.txt生成截图如下:
SYSTEMTIME sys;
GetLocalTime(&sys);
cout<<sys.wYear<<sys.wMonth<<sys.wDay<<sys.wHour<<sys.wMinute<<sys.wSecond<<endl;可以读取当前时间,头文件#include<windows.h>,我的想法是将时间强制转化为string,进行字符串的连接之后,形成一个string h,用h 命名文件名字。强制类型转化失败了。
- 读取单词
#include<string.h>
#include<fstream>
#include<iostream>
using namespace std;
int main(){
ofstream out("words"); out<<"you are so much kind!"<<endl;
out<<"guss this can be successd"<<endl;
out.close(); //手动创建文件 /*cout<<"Please Enter filename:\n";//在命令行窗口输入文件
string filename;
cin>>filename;
ifstream in(filename.c_str()) ;*/ ifstream in("words");
long linenum=,chnum=,wordnum=;
char str[];
while(in.getline(str,)){
for(int i=;i<strlen(str);i++)
{
chnum++;
if(str[i]==' '||str[i]==','||str[i]=='!')
wordnum++;
}
linenum++;
}
cout<<"行数:"<<linenum<<endl<<"字符数:"<<chnum<<endl<<"单词数:"<<wordnum<<endl;
in.close();
return ;
}
- 11-3