c++程序设计梳理(谭浩强)13章

 平淡的一天。昨天通宵了下,说好的生物钟又乱了,无奈~起床自己做了道菜,胡萝卜、土豆、青椒切成丝一起炒,长辣椒放多了原因,感觉辣味十足,下次一定只能放一个这种辣椒,太给力了!昨晚回归了下wow,我不知道有没有开100级,不过想了下自己最拿手的还是防战,由于当下的wow是一个变革期,所以还是切回最熟的天赋,以不变应万变来的比较踏实,还行,每个几分钟手感就回来了,分分钟上了89,再刷一次本就90的经验,今天总结完这一章上下线。今天女朋友看中的那款高跟鞋,自己也很是很欣赏的。可能性格比较传统吧,还是接受不了当下比较奇形怪状的女性装扮,所以怂恿了女朋友去买。价钱还不是自己所能承受的,只能默默的撸代码~%>_<%
 今天来总结第13章。这一章在c++中我感觉,似乎比java中来的要简洁一些!java中的在文件io的方面,相当多的内容啊!搞到弄一个标准输入输出也要各种绕啊绕啊。不过java当然有他的优势。c++设计成这样也必然有他的弊端,这是肯定的,只不过方便了初学者罢了,可这又有什么用?无论哪个初学者不要走到深入呢?

Chapter13
->输入输出流
1、输入输出流的有关类库(如表)。其实c++中整体常用输入输出总共分为三大块:标准输入输出、文件输入输出、字符串输入输出。

类名

作用在哪个头文件中声明
ios抽象基类iostream

istream

通用输入流和其他输入流的基类

iostream

ostream

通用输出流和其他输出流的基类

iostream

iostream

通用输入输出流和其他输入输出流的基类

iostream

ifstream

输入文件类

fstream

ofstream

输出文件类

fstream

fstream

输入输出文件类

fstream

istrstream 

输入字符串流类

strstream

ostrstream

输出字符串流类

strstream

strstream

输入输出字符串流类

strstream

 


2、标准输出:cout、cerr(不经过缓冲直接向显示器上输出)、clog(先存放在缓冲区中,缓冲区满后或遇endl时向显示器输出);标准输入:cin。


3、cin.get()与cin.getline()的实践与区别:

 

#include<iostream>
using namespace std;
int main(){
	char ch, ch_arr[20];
	cin.get(ch_arr,12,'\\');//这种读取是不会跳过最后的一个字符的
	cout << ch_arr
			<<","<<(char)cin.peek()<< endl;//这里用cin.peek()查看当下cin读到了哪里
	cin.ignore();//这个函数是将cin的读取指针跳过一个字节,如果当前字节是EOF(文件结尾),则结束跳过
	cin.get(ch_arr, 3, '\\');
	cout << ch_arr
		<< ","<<(char)cin.peek()<<endl;
	cin.getline(ch_arr, 3, '\\');//这种读取,在遇到'\'这个字符而结束的时候,我们将跳过'\'这个字符,cin指针指向下一个字符;但是如果是因为超出我们要读取的字节限制而结束的,那cin指针直接指向文件结尾(-1),下面的输入就是这种状况!
	cout << ch_arr <<","<<cin.peek()<< endl;
	return 0;
}
/*
此程序的运行结果:
输入:qwedsfd\wqfde\weds\
输出:qwedsfd,\
	  wq,f
	  fd,-1
*/

 

4、简单的文件输入输出的操作实例程序:

/*
从一个文件中读出里面存的一系列的整数,比较大小,将最大的存到另外一个文件当中去
*/

#include<iostream>
#include<fstream>
using namespace std;
int main(){
	ifstream input("jicheng.txt", ios::in);//以只读的方式打开文件
	ofstream output("jicheng2.txt", ios::out | ios::app);//在末尾追加文件,文件没有的话会新建文件
	int maxn,secn;
	input >> maxn;//这里要多说一句,因为用的是字符流的模式,所以是文件的对象能自动识别到底我们要读取的是什么类型的,如果申请的是一个char型的,那只读取文件的第一个字节的数据!
	while (!input.eof()){//此处是判断是否读到文件末尾
		input >> secn;
		if (secn > maxn){//判断大小
			maxn = secn;
		}
	}

	output << maxn;//输出文件
	
	input.close();//关闭文件
	output.close();
	return 0;
}

 

5、文件操作又例:

 

/*
一个简单的文件复制的程序,我碰到了编码的问题,这个似乎c++里面并不能修改文件的编码(java在这一点非常强大!)
*/

#include<iostream>
#include<fstream>
using namespace std;
int main(){
	ifstream input("jicheng.txt", ios::in);
	ofstream output("jicheng2.txt", ios::out);
	char ch;
	while (!input.eof()){
		//input >> ch ;//这个方式读取是要忽略回车的!!
		ch = input.get();
		if (ch == '\n'){
			cout << "这是回车!" << endl;
		}
		output << ch;
	}
	input.close();
	output.close();
	return 0;
}

 

6、基本字节流的操作。(书本上的这个例子很好,能全面的展示c++中对于字节流的输入与输出,所以我在此就把这个例子的代码打出来)

 

/*
有五个学生数据,要求:
(1)把他们存到磁盘上
(2)把磁盘上中的第1,3,5个学生数据读入程序,并显示出来
(3)将第3个学生的数据修改后存回磁盘文件中的原有位置
(4)从磁盘文件读入修改后的5个学生的数据并显示出来
*/

#include<iostream>
#include<fstream>
#include<string>
using namespace std;
struct Student{
	string name;
	int age;
	string sex;
};
int main(){
	Student stu[5] = { {"j1",12,"男"}, {"j2",13,"女"}, {"j3",14,"男"}, {"j4",15,"女"}, {"j5",16,"男"} };
	Student stu1;
	ofstream iofile("jicheng.dat",ios::out| ios::binary);//此处我试了下,不知道是不是vs编译器的原因,不能同时读和写二进制文件,同时的话报错!有待进一步研究!所以在此,我分开了读和写
	ifstream ifile("jicheng.dat", ios::binary);
	if (!iofile||!ifile){
		cerr << "open error!" << endl;
		abort();
	}
	for (int i = 0; i < 5; i++){
		iofile.write((char*)&stu[i], sizeof(stu[i]));
	}
	iofile.flush();//这个测试了下,一般io都有个缓存机制,如果这里不刷新缓存的换,后面的读是读不到数据的,因为文件中根本没有数据
	
	
	cout << "修改前的3个数据:" << endl;
	for (int i = 0; i < 5; i = i + 2){
		ifile.seekg(sizeof(stu1)*i, ios::beg);//此为定位函数
		ifile.read((char*)&stu1, sizeof(stu1));
		cout << stu1.name << "," << stu1.age << "," << stu1.sex << endl;
		if (i == 2){//此处当我读到第二个数据的时候,同时修改第二个数据!
			iofile.seekp(sizeof(stu1)*i,ios::beg);
			stu1.age = 144;
			stu1.name = "j33";
			stu1.sex = "女";
			iofile.write((char*)&stu1, sizeof(stu1));
			iofile.flush();
		}
	}
	
	
	ifile.seekg(0, ios::beg);
	cout << "修改后的5个数据:" << endl;
	for (int i = 0; i < 5; i++){
		ifile.read((char*)&stu1, sizeof(stu1));
		cout << stu1.name << "," << stu1.age << "," << stu1.sex << endl;
	}
	
	iofile.close();
	ifile.close();
	return 0;
}

p.s:在谭浩强这本书中,对于二进制文件的读取写的非常少,只简简单单的写了几页,这部分在以后的primer会着重加强。不过自我感觉用原生的c++读文件的情况还是较少的,似乎都是调用系统本身的API来进行文件IO,我觉得以后项目中应该都是这样!
 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值