`
为心中梦想挥剑的那一刹那
  • 浏览: 6857 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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,我觉得以后项目中应该都是这样!
 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics