c++primer 练习题8.1-8.14
2019-05-03 本文已影响0人
青吟乐
8.1函数方法实现
istream& function(istream& is){
//定义一个buffer接收输入流is的内容
string buffer;
//用whilie条件判定流对象的状态是否良好
while(is>>buffer){
//显示从is对象读入buffer的内容
cout<<buffer<<endl;
}
//清除异常位使is有效
is.clear();
return is;
}
8.2接8.1
int main()
{
string str;
//放入cin里面点东西
cout<<"输入字符串流"<<endl;
//从cin中读入is
istream& is = function(cin);
//显示is的当前的状态
is>>str;
cout << is.rdstate() << endl;
return 0;
}
8.3
cin没问题会一直循环
循环终止条件:cin的failbit位,eofbit位,badbit位任何一位出现问题都会终止循环
8.4 函数加运行测试
#include <iostream>
#include <fstream>
#include<vector>
using namespace std;
void readFileToVector(const string& fileName, vector<string>& vec)
//文件路径用const固定
{
//创建一个输入流对象并且打开文件
ifstream ifs(fileName);
if (ifs)//验证文件是否打开
{
cout<<"文件打开成功"<<endl;
//用一个string类型接收文件内容
string buf;
while (getline(ifs, buf)){//判断是否成功读入一行数据到buf
//看看读入了什么内容,发现木得问题
cout<<buf<<endl;
vec.push_back(buf);
}
}
}
int main()
{
vector<string> vec;
string str="C:\\study\\c++test\\endless.txt";
readFileToVector(str,vec);
return 0;
}
8.5只是将getline方法改成了ifs>>,main方法不再赘述
//文件路径用const固定
void readFileToVector(const string& fileName, vector<string>& vec)
{
//创建一个输入流对象并且打开文件
ifstream ifs(fileName);
if (ifs)//验证文件是否打开
{
cout<<"文件打开成功"<<endl;
//用一个string类型接收文件内容
string buf;
while (ifs>>buf){
//这里注意测试的时候给的文件内容要有空格才会断行
cerr<<buf<<endl;
vec.push_back(buf);
}
}
}
8.6这里我只是简单的给了ifs对象一个绝对路径将里面的内容读入到trans对象中
string str = "C:\\study\\c++test\\endless.txt";
int main(string xxx)
{
//接收一个string的文件名
xxx=str;
ifstream ifs(xxx);
Sales_data total;
if (read(ifs, total))
{
Sales_data trans;
while (read(ifs, trans))
{
if (total.isbn() == trans.isbn())
total.combine(trans);
else
{
print(cout, total) << endl;
total = trans;
}
}
print(cout, total) << endl;
}
else
{
cerr << "No data?!" << endl;
}
return 0;
}
8.7
代码
#include <iostream>
#include"Sales_date.h"
#include<fstream>
#include <iostream>
using namespace std;
int main(char **addr)
{
//接收文件名
addr[0]="C:\\study\\c++test\\endless.txt";
addr[1]="C:\\study\\c++test\\in_file.txt";
//创建输入输出流对象
ifstream ifs(addr[0]);
ofstream ofs(addr[1]);
Sales_data total;
//如果从total对象中读入数据正常
if (read(ifs, total))
{
Sales_data trans;
//从trans对象中读入数据正常就循环
while (read(ifs, trans))
{
if (total.isbn() == trans.isbn())
total.combine(trans);
else
{
print(ofs, total) << endl;
total = trans;
}
}
print(ofs, total) << endl;
}
else
{
cerr << "No data?!" << endl;
}
return 0;
}
8.8,在8.7定义输出流对象ofs的时候用ate或者app模式打开即可
ofstream ofs(addr[1],ofstream::app);//默认打开模式设定为app模式
8.9,用8.1.2节的方法创建istringstream的对象,将其中的内容输入到字符串并显示
#include <iostream>
#include<sstream>
using namespace std;
istream& Return(istream& is){//以istream对象的地址传参
string is_stream;//istream对象中的内容写入到stream中
while(getline(is,is_stream)){//按行检测
cout<<is_stream<<endl;//按行输出
}
is.clear();
return is;
}
int main()
{
string str="吹 牛 x\n 是的撒多";
istringstream iss(str);
Return(iss);
return 0;
}
8.10,利用8.1.3的方法从文件读到vector中,再从vector中读出啦
#include <iostream>
#include<sstream>
#include<vector>
#include<fstream>
using namespace std;
//从文件中读入vector的方法
void readFileToVector(const string& fileName, vector<string>& vec)
{
//创建一个输入流对象并且打开文件
ifstream ifs(fileName);
if (ifs)//验证文件是否打开
{
cout<<"文件打开成功"<<endl;
//用一个string类型接收文件内容
string buf;
while (ifs>> buf){//判断是否成功读入一行数据到buf
vec.push_back(buf);
}
}
}
int main()
{
//从文件中读入到vec
vector<string> vec;
string str="C:\\study\\c++test\\endless.txt";
readFileToVector(str,vec);
//从vec读入到string字符串中
for (auto &s : vec)
{
istringstream iss(s);//用s去遍历vec
string word;
while (iss >> word)
cout << word << ", ";//因为>>读入的时候碰到,自动断
}
return 0;
}
8.11
int main()
{
string line,word;
vector<PersonInfo> people;
//定义要求的istringstream对象record;
istringstream record;
while(getline(record,line)){
PersonInfo info;
//确保record能用
record.clear();
//当前line数据拷贝到record中,
//此行基本代替了书上将对象实例化在while循环中
//书中是在此处实例化临时对象的同时
record.str(line);
record >> info.name;
while(record>>word){
info.phones.push_back(word);
}
people.push_back(info);
}
return 0;
}
8.12
PersonInfo类中都是public属性的变量,不需要在类内初始化就可以在类外修改
8.13
以下代码未验证,仅供参考。。。
#include <iostream>
#include<vector>
#include<stringstream>
#include<fstream>
using namespace std;
class PersonInfo{
public:
string name;
vector<string> phones;
};
int main()
{
ifstream ifs("C:\\study\\c++test\\endless.txt");
string line ,word;//保存来自输入的一行和一个单词的数据
vector <PersonInfo> people;//保存文件的一切信息
while(getline(ifs,line)){
PersonInfo info;
istringstream record(line);
record>>info.name;
while(record>>word){
info.phones.push_back(word);
}
people.push_back(info);
}
for(const auto &entry:people){
ostringstream formatted,badnums;
for(const auto &nums:entry.phones){
if(!vaild(nums)){
badnums<<" "<<nums;
}else{
formated<<" "<<format(nums);
}
}
if(badnums.str().empty()){
os<<entry.name<<" "<<formatted.str()<<endl;
}else{
cerr<<"input error:"<<entry.name<<"invailed number(S)"<<badnums.str()<<endl;
}
}
return 0;
}
8.14
类类型的参数使用地址传递效率更高,速度更快
const关键字防止意外修改参数