二进制读文件
ifstream fstream 读
ofstream fstream 写
inFile.gcount();//看刚才读了多少个字节
比如快到文件末尾,如果最后只剩8个字节,却要读10个字节,最后只会读8个字节
fstream东西比较全
‘ ’
为什么存成.dat格式?比纯文本节省空间,空格也占空间,纯文本是字符串格式
10亿,10个字节,.dat 一个int 4个字节搞定
Jane 本来后面就有个
Mike
内存缓冲区
二进制文件和文本文件的区别
二进制读文件
ifstream
和 fstream 的成员函数:
istream& read (char* s, long n)
将文件读指针指向的地方的 n 个字节内容,读入到内存地址 s ,然
后将文件读指针向后移动 n 字节 以 ios ::in 方式打开文件时,文件读指
针开始指向文件 开头 。
二进制写文件:
ofstream
和 fstream 的成员函数:
istream& write (const char* s, long n);
将内存地址
s 处的 n 个字节内容,写入到文件中写指针指向的位置,
然后将文件写指针向后移动 n 字节 以 ios::out 方式打开文件时,文
件写指针开始指向文件开头 , 以 ios::app 方式打开文件时,文件写
指针开始指向文件尾部 。
/* 二进制文件读写 在文件中写入和读取一个整数 */ #include<iostream> #include<fstream> using namespace std; int main() { ofstream fout("some.dat", ios::out | ios::binary); int x = 120; fout.write((const char*)(&x), sizeof(int)); //将内存地址x的内容,写到文件指针所指向的位置 fout.close(); ifstream fin("some.dat", ios::in | ios::binary); int y; fin.read((char*)&y, sizeof(int)); // 读到内存地址 y fin.close(); cout << y << endl; return 0; }
/* 从键盘输入几个学生的姓名的成绩,并以二进制文件形式保存 */ #include<iostream> #include<fstream> using namespace std; struct Student { char name[20]; int score; }; int main() { Student s; ofstream OutFile("E:\C++_POJ_2019\week7\Project4\Project4\students.dat", ios::out | ios::binary); while (cin >> s.name >> s.score) OutFile.write((char*)&s, sizeof(s)); OutFile.close(); return 0; } /* 输入: Tom 60 Jack 80 Jane 40 ^Z+回车 */
/* 将 students.dat 文件的 Jane 的名字改成 Mike */ #include<iostream> #include<fstream> using namespace std; struct Student { char name[20]; int score; }; int main() { Student s; fstream iofile("students.dat", ios::in | ios::out | ios::binary); if (!iofile) { cout << "error"; return 0; } iofile.seekp(2 * sizeof(s), ios::beg);// 定位写指针到第三个记录 iofile.write("Mike", strlen("Mike") + 1); iofile.seekg(0, ios::beg); // 定位读指针到开头 while (iofile.read((char*)&s, sizeof(s))) cout << s.name << " " << s.score << endl; iofile.close(); return 0; } /* 输出: Tom 60 Jack 80 Mike 40 */
函数模板
编译器由模板生成函数的过程称为模板的实例化
也可以 不通过参数实例化函数模板
函数模板可以重载
函数模板和函数的次序
匹配模板函数时,不进行类型自动转换
如果懒得写很多很像的函数 那就写一个函数模板
如果懒得写很多很像的类 那就写一个类模板
类模板
类模板与派生
类模板从类模板派生
•
类模板从模板类派生
•
类模板从普通类派生
•
普通类从模板类派生
类模板与友员函数
•
函数 、 类 、 类的成员函数作为类模板的友元
•
函数模板作为类模板的友元
•
函数模板作为类的友元
•
类模板作为类模板的友元