一、实验目的

  • 理解流的概念
  • 熟悉流类库中常用的类及成员函数用法
  • 熟悉 I/O 格式控制方法,掌握常用格式控制
  • 了解文件 I/O,掌握文件 I/O 基本用法

二、实验准备

结合第 11 章教材、课件,复习/学习如下内容:

  • 基础知识

    • 流是什么?如何理解?
    • C++中 I/O 是通过什么来实现的?
    • 常用 I/O 流类的继承/派生层次关系
    • 预定义标准流对象 cin, cout, cerr, clog
  • C++中格式化 I/O 方法
  • 文件 I/O 方法及常用成员函数

三、实验内容

  • 基础练习

    • 教材习题 11-7
    • 教材习题 11-3
    • 教材习题 11-4
  • 应用练习
    • 已知有班级名单文件 list.txt(见实验 7 附件包)。编写一个应用程序实现随机抽点
      5 位同学,在屏幕上显示结果,同时,也将结果写入文件 roll.txt。

      • 编写程序实现题目基本功能要求。(必做)
      • (******选做******)
        对①中实现的基本功能进行完善、扩充,使得这个点名应用程序更灵活、更方便。比如:

        • 从键盘输入班级文件名,支持对不同班级的点名操作;
        • 从键盘输入用于保存点名结果的文件名。更灵活地,自动获取当前系统日期作为文件名,比如 20180612.txt。(如果希望更细粒度,文件名可以到小时和分钟这一层级);
        • 随机抽点人数不固定,通过键盘按键控制何时抽点结束;
        • 通过菜单及程序的函数模块划分,或类的设计与实现,做成一个更完善的应用,等等。
    • 统计英文文本文件字符数、单词数、行数,文件名由键盘输入。
      • 编写 C++程序实现题目基本功能要求。(必做)
      • ******选做******
        • 提供菜单,由用户选择统计内容;
        • 思考当文本内容数量级偏大,①处已实现的程序能否胜任,实现快速统计?在算法和处理逻辑上是否存在进一步改进的部分?

四、实验步骤

4.1 基础练习

4.1.1 11-7

  • 注释:
#include <iostream>
using namespace ::std;
int main() {ios_base::fmtflags original_flags = cout.flags(); //保存cout参数设置 cout<< 812<<'|';cout.setf(ios_base::left,ios_base::adjustfield); //设置cout的对齐方式为左对齐 cout.width(10); //将cout宽度改为10 cout<< 813 << 815 << '/n';cout.unsetf(ios_base::adjustfield); //取消cout对齐方式的设置 cout.precision(2);// 设置浮点数输出的精度值 cout.setf(ios_base::uppercase|ios_base::scientific); //设置浮点数的显示参数 cout << 831.0 ;cout.flags(original_flags); //恢复cout原参数设置 return 0;
}
  • Screenshot:

    4.1.2 11-3

  • Code:
#include<bits/stdc++.h>
using namespace std;
int main(){ofstream fout("test1.txt");fout<<"已成功写入文件!";fout.close();return 0;
}
  • 演示:

4.1.3 11-4

  • Code:
#include<bits/stdc++.h>
using namespace std;
int main(){ifstream fin("test1.txt");string tmp;getline(fin,tmp);cout<<tmp;fin.close();system("pause");return 0;
}
  • 演示:

4.2 应用练习

4.2.1

  • ①:必做部分:
#include<bits/stdc++.h>
#define rap(a,b) for(int a=0;a<b;++a)
using namespace std;
struct stu{int num;string stuid,name,cls;
}tmp;
ostream &operator <<(ostream &o,const stu &tmp){o<<tmp.num<<" "<<tmp.stuid<<" "<<tmp.name<<" "<<tmp.cls<<endl;return o;
}
ifstream fin;
int main(){ifstream fin("list.txt");vector<stu>a;while(fin>>tmp.num>>tmp.stuid>>tmp.name>>tmp.cls){a.push_back(tmp);}//cout<<a.size();fin.close();ofstream fout("roll.txt");srand((unsigned)time(NULL)); rap(i,5){int tmp2=rand()%a.size();cout<<a[tmp2];fout<<a[tmp2];  }fout.close();return 0;
}

控制台窗口运行结果:

运行文件夹及文件截图:

  • ②:选做部分
    实现功能:通过输入班级序号选择班级进行点名,通过ENTER键控制点名数量,通过时间或用户输入的字符串保存文件:
    Code:
#include<bits/stdc++.h>
#define rap(a,b) for(int a=0;a<b;++a)
using namespace std;
struct stu{int num;string stuid,name,cls;
}tmp;
ostream &operator <<(ostream &o,const stu &tmp){o<<tmp.num<<" "<<tmp.stuid<<" "<<tmp.name<<" "<<tmp.cls<<endl;return o;
}
int cmp(const stu &a,const stu  &b){return a.cls>b.cls;
}
void callbyclass(vector<stu>a,vector<stu>*res){int sz=a.size();sort(a.begin(),a.end(),cmp);vector<int>clsidx; string tmp=a[0].cls;clsidx.push_back(0);rap(i,sz){if(a[i].cls!=tmp){clsidx.push_back(i);tmp=a[i].cls;}}clsidx.push_back(sz);cout<<"Class:"<<endl;rap(i,clsidx.size()-1)cout<<i+1<<" : "<<a[clsidx[i]].cls<<endl;cout<<"Please Choose Class num to call student"<<endl;int idx;cin>>idx;while(idx>clsidx.size()){cout<<"Wrong Class number, plz choose again!"<<endl;cin>>idx;}getchar();do{int t=rand()%(clsidx[idx]-clsidx[idx-1]);cout<<a[t+clsidx[idx-1]];res->push_back(a[t+clsidx[idx-1]]);}while(getchar()=='\n');
}
int main(){time_t t = time(0);ifstream fin("list.txt");vector<stu>a;while(fin>>tmp.num>>tmp.stuid>>tmp.name>>tmp.cls){a.push_back(tmp);}fin.close();srand((unsigned)time(NULL));vector<stu>res;callbyclass(a,&res);cout<<"Save by time enter 1, by your desired string enter 2.\n";int tmp;cin>>tmp;if(tmp==1){char ch[64];strftime(ch, sizeof(ch), "%Y%m%d%H%M%S.txt", localtime(&t)); ofstream fout(ch);rap(i,res.size())fout<<res[i];fout.close();}else if(tmp==2){string n;cout<<"\nPlz enter your filename:"<<endl;cin>>n;ofstream fout(n.c_str());rap(i,res.size())fout<<res[i];fout.close();}return 0;
}

演示效果如下:

4.2.2

  • ① 必做部分:
    算法思路:利用getline函数读入每一行,每一行得到的 string.size() 即为每行字符数量,利用 strtok 分割文本得到单词数。
    Code:
#include<bits/stdc++.h>
using namespace std;
const char de[]={'"',',',' ','.','\0','!','?','-','(',')','#','/',':'};
int main(){cout<<"Please Enter filname:\n";string filename;cin>>filename;ifstream fin(filename.c_str());string line;long long linenum=0,chnum=0,wordnum=0;while(getline(fin,line)){char *tmp=new char[line.length()+1];strcpy(tmp,line.c_str());char *tmp2;tmp2=strtok(tmp,de);if(tmp2!="")wordnum++;while((tmp2=strtok(NULL,de)))wordnum++;linenum++;chnum+=line.size();}cout<<"行数:"<<linenum<<" 字符数:"<<chnum<<" 单词数:"<<wordnum;fin.close();return 0;
} 
  • 测试文件1(233.txt):
  • 测试文件2 (bible.txt):

转载于:https://www.cnblogs.com/shy-/p/9163026.html

实验 7:流类库与输入输出相关推荐

  1. C++:流类库与输入输出

    7.2.1 C++的输入输出流 ios:流基类(抽象类) istream:通用输入流类和其他输入流的基类 ostream:通用输出流类和其他输出类的基类 iostream:通用输入输出流类和其他输入输 ...

  2. 实验8 群体类、流类库与输入/输出(4学时)

    一. 实验目的 了解链表类的定义与实现,学习其使用方法: 了解栈类的定义与实现,学习其使用方法: 了解队列类的定义与实现,学习其使用方法: 了解C++标准模板库STL的使用方法. 熟悉流类库中常用的类 ...

  3. c++I/O流的概念和流类库的结构

    I/O流的概念和流类库的结构 程序的输入 程序的输出 C++输入输出包含以下三个方面的内容 C++的I/O对C的发展--类型安全和可扩展性 与iostream类库有关的头文件 在iostream头文件 ...

  4. c++中的IO流(流的概念和流类库的结构,标准的输入输出流)

    流的概念和流类库的结构 程序的输入指的是从输入文件将数据传送给程序,程序的输出指的是从程序将数据传送给输出文件 c++输入输出包含以下三个方面的内容 对系统指定的标准设备的输入输出.即从键盘输入数据, ...

  5. C++——流类库和输入/输出

    前言 数据是怎么写道磁盘的? 代码里面我们一个读写调用似乎就能将数据从磁盘读写.仿佛代码是直接和磁盘打交道.以我们最常见的笔记本.或台式机的磁盘SATA盘为例,其受南桥上ATA控制器支配,这里面传输的 ...

  6. 常用的I/O流类库操纵符

    当使用cin,cout进行数据的输入和输出时,无论处理的是什么类型的数据,都能够自动按照正确的默认格式处理.但是这还不够. C++I/O流类库提供了一些操纵符,可以直接嵌入到输入输出语句中来实现I/O ...

  7. 习题八 I/O流类库

    一.填空题 (1)在C++的输入输出系统中,最核心的对象是        流         .执行输入和输出操作的类体系叫做         流类          . (2)当实际进I/O操作时, ...

  8. 大学物理实验 载流圆线圈轴线上的磁场分布

    大学物理实验 载流圆线圈轴线上的磁场分布 首先说好,本宝宝不定期更新 另外,代码写的比较冗杂,需要拿走,不喜勿喷. 考虑到有可能会有不太精通Python的朋友,首先是说好,本代码仅支持Jupyter ...

  9. ca76a_c++_流文件打开输入输出文件模式

    /*ca76a_c++_流文件打开输入输出文件模式 利用文件流打开文件进行输入与输出时的选项 in.out.app(附加模式).ate((end)文件打开后,定于文件结尾).trunc(裁剪).bin ...

最新文章

  1. 用人铁律:高层看胸怀、中层看德行、基层看才能
  2. python在日常工作处理中的应用-记 Python 在实际工作中的第一次应用
  3. 程序员遇到的奇葩bug大集锦,硬盘开光很有必要!
  4. spring @Order注解
  5. 国内传感器市场也许正处在最好的时候
  6. 【LeetCode笔记】41. 缺失的第一个正数(Java、哈希)
  7. C语言-字符串处理函数strcat
  8. 【JZOJ3347】树的难题
  9. 脚本——web_custom_request函数详解
  10. linux使用小命令使用汇集
  11. 基于私有云的数据库高可用架构实践
  12. 关于form提交后展示遮罩及显示进度条gif问题
  13. 这可能是最详细的Arduino制作4*4光立方教程(原创)
  14. 计算机学习路线及java图书参考
  15. Python安装jpype,注意版本对应
  16. 读《晨间日记的奇迹》有感
  17. 联想r480安全模式_thinkpad笔记本如何进入安全模式?
  18. 润乾报表学习一:制作最简单的报表
  19. Jenkins卸载方法
  20. C语言推箱子(带回退,撤回,返回上一步功能)

热门文章

  1. (3)nginx的虚拟主机配置
  2. 如何在liferay ,struts2中跳转页面
  3. Java高次方数尾数输出_C语言求高次方数的尾数代码解析
  4. 性能测试报告模板_性能测试新手误区
  5. VGG模型构建与实现
  6. 互联网公司面试经历(转载)
  7. 特征分解与奇异值分解
  8. 逻辑回归:损失函数与梯度下降
  9. 剑指offer 翻转链表
  10. NLTK完成简单的情感分析