您的位置:首页 > 编程语言 > C语言/C++

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

2015-09-16 00:00 323 查看
平淡的一天。昨天通宵了下,说好的生物钟又乱了,无奈~起床自己做了道菜,胡萝卜、土豆、青椒切成丝一起炒,长辣椒放多了原因,感觉辣味十足,下次一定只能放一个这种辣椒,太给力了!昨晚回归了下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,我觉得以后项目中应该都是这样!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: