平淡的一天。昨天通宵了下,说好的生物钟又乱了,无奈~起床自己做了道菜,胡萝卜、土豆、青椒切成丝一起炒,长辣椒放多了原因,感觉辣味十足,下次一定只能放一个这种辣椒,太给力了!昨晚回归了下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,我觉得以后项目中应该都是这样!