zoukankan      html  css  js  c++  java
  • C++程序设计POJ》《WEEK7 输入输出和模板》《二进制文件读写》《模板》《类模板与派生》

    二进制读文件

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

    函数模板

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

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

    函数模板可以重载

    函数模板和函数的次序

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

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

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

    类模板

    类模板与派生

    类模板从类模板派生

    类模板从模板类派生

    类模板从普通类派生

    普通类从模板类派生

    类模板与友员函数

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

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

    函数模板作为类的友元

    类模板作为类模板的友元

  • 相关阅读:
    HDU 3466(01背包变种
    HDU 2639(01背包第K大)
    POJ 2184(01背包)(负体积)
    UVA 562(01背包)
    UVA 624(01背包记录路径)
    SQL总结二
    oracle--知识点汇总1
    时间日期----java
    字符串、数值----转换
    字符串反转----示例
  • 原文地址:https://www.cnblogs.com/focus-z/p/11147632.html
Copyright © 2011-2022 走看看