C++程序设计POJ》《WEEK7 输入输出和模板》《二进制文件读写》《模板》《类模板与派生》

与世无争的帅哥 提交于 2020-04-04 00:44:19

二进制读文件

ifstream fstream  读

ofstream fstream 写

inFile.gcount();//看刚才读了多少个字节

比如快到文件末尾,如果最后只剩8个字节,却要读10个字节,最后只会读8个字节

fstream东西比较全

‘\0’

为什么存成.dat格式?比纯文本节省空间,空格也占空间,纯文本是字符串格式

10亿,10个字节,.dat 一个int 4个字节搞定

Jane 本来后面就有个\0

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
*/

函数模板

编译器由模板生成函数的过程称为模板的实例化

也可以 不通过参数实例化函数模板

函数模板可以重载

函数模板和函数的次序

匹配模板函数时,不进行类型自动转换

 

如果懒得写很多很像的函数 那就写一个函数模板

如果懒得写很多很像的类 那就写一个类模板

 

 

 

类模板

 

类模板与派生

 

类模板从类模板派生

类模板从模板类派生

类模板从普通类派生

普通类从模板类派生

 

 

 

类模板与友员函数

函数 、 类 、 类的成员函数作为类模板的友元

函数模板作为类模板的友元

函数模板作为类的友元

类模板作为类模板的友元

 

 

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!