37_iostream流

stream流:著名的设计

抽象成输出流和输入流,通用的操作方法

Ostream:输出流

Istream:输入流

ofstream:文件输出流,头文件<fstream>

文本方式

ofsteam of;

of.open(“1.txt”, ios::out);

of << “text” << endl;’

of << 3.5 << endl;

of.flush(); //刷新

of << flush; //刷新

of.close(); //关闭

二进制方式

ofsteam of(“1.txt”, ios::out | ios:binary);

of.write(“hello”, 6);

int n = 0x1234567;

of.write((char*)&n, sizeof(n));

of.bad(); //是否失败

of.good(); //判断是否成功,返回值是缓冲器的引用

of.close();

ifstream文件输入流,头文件<fstream>

文本方式

ifstream ifs(“1.txt”, ios::in);

if(ifs.good()) //每次检查是否成功

{

Char buff[6];

Ifs >> buffer; //有字符串的时候得长度一致,不包含空格

Ifs.getline(buff, sizeof(buffer)); //有字符串的时候得长度一致,包含空格

Ifs.seekg(偏移,从何处开始移动); //在基类里面

Int n;

Ifs >> n;

}

ifs.close()

二进制方式

ifstream ifs(“1.txt”, iso::in | ios:binary);

if(ifs.good()) //每次检查是否成功

{

Char buff[6];

Ifs.read(buffer, 6);

Int n;

Ifs.read((char *)&n, sizeof(n));

}

ifs.close();

fstream:文件输入输出流

功能

包含文件输入输出流的所有功能

文件流操作对象 支持自定义类型(流的唯一好处)

在类中重载运算符

Fstream& operator << (fstream& fs, 类对象实例引用);

{

Fs.write((char *)&类对象实例属性, 大小)

Return fs;

}

Fstream& operator >> (fstream& fs, 类对象实例引用);

{

Fs.read((char *)&类对象实例属性, 大小)

Return fs;

}

串流,头文件<strstream>

Istrstream:输入串流

Istrstream os(“qwdwq dwqwd wqdq12 3245t”); //分隔字符串

For(int I = 0; I < 4; i++)

{

Os>> buffer;

Cout << buffer << endl;

}

Ostrstream:输出串流

Ostrstream os;

Os << buffer << n << d; //一口气写

Strstream

    1. 解决不了溢出问题,很少用
    2. C++程序员一般把C库函数的文件操作封装成类,方便操作

作业

1.编写程序,使用文件流读入一个文件,并统计文件行数;

 //totalFileLines.cpp
#include 
#include 

using namespace std;

int main()
{
    char buff[2048];
    int iLine = 0;
    ifstream ifs("totalFileLines.cpp", ios::in);
    while (!ifs.eof())
    {
        ifs.getline(buff, sizeof(buff));
        iLine++;
    }

    ifs.close();

    cout << "文件一共有" << iLine << "行" << endl;
    system("pause");

    return 0;
} 

2.设字符串string="1 2 3 4 5 6 7 8 9",用串流I/O的方法编程逐个读取这个串的每个数,
直到读完为止,并在屏幕上输出。

 //separate.cpp
#include 
#include 

using namespace std;

int main()
{
    char szStr[] = "1 2 3 4 5 6 7 8 9";
    char szBuff[1024] = { '\0' };

    istrstream is(szStr);
    //ostrstream os;

    while (!is.eof())
    {
        is >> szBuff;
        cout << szBuff << endl;
        //os << szBuff << endl;
    }
    
    system("pause");
    return 0;
}

3.定义一个学生类,然后根据学生类创建一个对象,接着将该对象的数据成员的值输出到文件中,
并将该数据读入到内存以检查文件的读写是否有误。

 //Student.h
#pragma once
#include 
#include 
#include 
using namespace std;

class CStudent
{
public:
    CStudent(const char* name = NULL, int age = 0)
    {
        if (name != nullptr)
        {
            strcpy_s(name_, 200, name);
        }
        age_ = age;
    }

    const char* getName();
    const int getAge();
    void setName(const char* name);
    void setAge(const int age);

    friend ostream& operator<< (ostream& os, CStudent& stu)
    {
        os << "name:" << stu.name_;
        os << " age:" << stu.age_ << endl;
        return os;
    }
private:
    char name_[200];
    int  age_;
};
 //Student.cpp
#include "Student.h"

const char * CStudent::getName()
{
    return name_;
}

const int CStudent::getAge()
{
    return age_;
}

void CStudent::setName(const char * name)
{
    strcpy(name_, name);
}

void CStudent::setAge(const int age)
{
    age_ = age;
}

 //test.cpp
#include "Student.h"


int main()
{
    //写
    ofstream fs("1.txt", ios::out | ios::binary);
    CStudent stu1("adasdqd2d", 20);
    CStudent stu2("lsssssssssssssi", 21);
    int age = 0;
    int len = 0;

    len = strlen(stu1.getName()) + 1;
    fs.write(stu1.getName(), len);
    age = stu1.getAge();
    fs.write((char *)&age, sizeof(stu1.getAge()));
    
    len = strlen(stu2.getName()) + 1;
    fs.write(stu2.getName(), len);
    age = stu2.getAge();
    fs.write((char *)&age, sizeof(stu2.getAge()));

    fs.close();

    //读
    ifstream fs2("1.txt", ios::in | ios::binary);
    CStudent stu3;
    CStudent stu4;
    char szBuf[1024];

    fs2 >> szBuf;
    stu3.setName(szBuf);
    fs2.seekg(1L, ios::cur);
    fs2.read(szBuf, sizeof(int));
    stu3.setAge(*(int *)szBuf);

    fs2 >> szBuf;
    stu4.setName(szBuf);
    fs2.seekg(1L, ios::cur);
    fs2.read(szBuf, sizeof(int));
    stu4.setAge(*(int *)szBuf);

    cout << stu3 << stu4 << endl;
    fs2.close();

    system("pause");
    return 0;
}

4.实现一个通讯录程序。格式为,姓名,单位,电话,住址,宅电,要求建立Person类,
然后使用文件流保存和显示

 //Person.h
 #pragma once
#include 
#include 
#include 
using namespace std;


class CPerson
{
public:
    CPerson(char *name = nullptr, char *unit = nullptr, char *phone = nullptr,
        char *address = nullptr, char *electricity = nullptr);
    ~CPerson();
private:
    char m_szName[33];
    char m_szUnit[101];
    char m_szPhone[21];
    char m_szAddress[51];
    char m_szElectricity[15];
};
 //Person.cpp
#include "Person.h"

CPerson::CPerson(char * name, char * unit, char * phone, char * address, char * electricity)
{
    if (name != nullptr)
    {
        strcpy_s(m_szName, sizeof(m_szName) - 1, name);
    }

    if (unit != nullptr)
    {
        strcpy_s(m_szUnit, sizeof(m_szUnit) - 1, unit);
    }

    if (phone != nullptr)
    {
        strcpy_s(m_szPhone, sizeof(m_szPhone) - 1, phone);
    }

    if (address != nullptr)
    {
        strcpy_s(m_szAddress, sizeof(m_szAddress) - 1, address);
    }

    if (electricity != nullptr)
    {
        strcpy_s(m_szElectricity, sizeof(m_szElectricity) - 1, electricity);
    }
}

CPerson::~CPerson()
{
}

5.定义一个dog类,包含体重和年龄两个成员变量及相应的成员函数,声明一个实例dog1,
体重为5,年龄为10,使用I/O流把dog1的状态写入磁盘文件,
再声明另一个实例dog2,通过读文件把dog1的状态赋给dog2。
分别使用文本方式和二进制方式操作文件

0 条评论
发表一条评论