一、实验目的
- 理解流的概念
- 熟悉流类库中常用的类及成员函数用法
- 熟悉 I/O 格式控制方法,掌握常用格式控制
- 了解文件 I/O,掌握文件 I/O 基本用法
二、实验准备
结合第 11 章教材、课件,复习/学习如下内容:
1.基础知识
(1)流是什么?如何理解?
(2)C++中 I/O 是通过什么来实现的?
(3)常用 I/O 流类的继承/派生层次关系
(4)预定义标准流对象 cin, cout, cerr, clog
2.C++中格式化 I/O 方法
3.文件 I/O 方法及常用成员函数
三、实验内容
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) 思考当文本内容数量级偏大,①处已实现的程序能否胜任,实现快速统计?在算法和处理逻辑上是否存在进一步改进的部分?
四、实验结论
1.基础练习
(1)教材习题 11-7
① 源码及运行结果截图;
② 以注释方式标注格式控制部分的作用;
#include <iostream>
using namespace std;
int main() {
ios_base::fmtflags original_flags = cout.flags(); //1保存现在的格参数设置
cout<< 812<<'|';
cout.setf(ios_base::left,ios_base::adjustfield); //2把对齐方式改为左对齐
cout.width(10); //3输出的宽度改为10
cout<< 813 << 815 << '\n';
cout.unsetf(ios_base::adjustfield); //4取消对齐方式的设置
cout.precision(2);
cout.setf(ios_base::uppercase|ios_base::scientific); //5设置 浮点数的显示
cout << 831.0 ;
cout.flags(original_flags); //6恢复原来的设置
return 0;
}

(2)教材习题 11-3
① 源码及程序运行结果截图。
② 截图显示磁盘上是否生成指定文件,并且正确写入数据。
#include<fstream>
using namespace std;
int main() {
ofstream file("test1.txt");
file<<"已成功写入文件!";
file.close();
return 0;
}

(3)教材习题 11-4
① 源码及程序运行结果截图。
② 截图显示磁盘上源文件内容,与屏幕显示结果对照,是否正确读入。
#include <fstream>
#include<iostream>
using namespace std;
int main(){
string s;
ifstream file("test1.txt");
getline(file,s);
cout<<s;
file.close();
return 0;
}

2.应用练习
(1)
① 源码及程序运行结果截图;磁盘文件 roll.txt 及内容截图;
#include<iostream>
#include<fstream>
#include<string>
#include<stdlib.h>
using namespace std;
int m;
struct student
{
string num;
string id,name,clas;
}stu[100];
int main(){
ifstream fin("list.txt");
int i=0;
while(fin>>stu[i].num>>stu[i].id>>stu[i].name>>stu[i].clas)
{
i++;
}
fin.close();
int a,j=5;
ofstream fout("roll.txt");
while(j--)
{
a=rand()%i+1;
cout<<stu[a].num<<" "<<stu[a].id<<" "<<stu[a].name<<" "<<stu[a].clas<<endl;
fout<<stu[a].num<<" "<<stu[a].id<<" "<<stu[a].name<<" "<<stu[a].clas<<endl;
}
fout.close();
return 0;
}


(2)借鉴了大佬的算法思路!!!
①
a) 简洁陈述统计字符数、单词数、行数的算法思路;
b) 源码及程序运行结果截图;用于测试统计的文本文件内容截图;
#include<string.h>
#include<fstream>
using namespace std;
int main(){
string filename;
cin>>filename;
ifstream fin(filename.c_str());
long line=0,ch=0,word=0;
char str[1000];
while(fin.getline(str,1000))
{
for(int i=0;i<strlen(str);i++)
{
ch++;
if(str[i]=='?'||str[i]==','||str[i]=='.'||str[i]=='!'||str[i]=='('||str[i]==')'||str[i]==' '
||str[i]=='"'||str[i]=='-'||str[i]=='#'||str[i]=='/'||str[i]==':')
word++;
}
line++;
}
cout<<"行数:"<<line<<endl<<"字符数:"<<ch<<endl<<"单词数:"<<word<<endl;
return 0;
}


注:
① 源代码中,必要的部分,请添加注释,增加代码的可读性
② 博客园中请采用平台支持的插入代码方式,以方便其它同学评阅和测试运行。
来源:https://www.cnblogs.com/su22/p/sy07.html