C++文件读写

 
#include <fstream>  
ofstream         //文件写操作 内存写入存储设备   
ifstream         //文件读操作,存储设备读区到内存中  
fstream          //读写操作,对打开的文件可进行读写操作   

 

1.打开文件

在fstream类中,成员函数open()实现打开文件的操作,从而将数据流和文件进行关联,通过ofstream,ifstream,fstream对象进行对文件的读写操作

函数:open()

void open ( const char * filename,  
            ios_base::openmode mode = ios_base::in | ios_base::out );  
  
void open(const wchar_t *_Filename,  
        ios_base::openmode mode= ios_base::in | ios_base::out,  
        int prot = ios_base::_Openprot); 

参数: filename   操作文件名

           mode        打开文件的方式

           prot         打开文件的属性                            //基本很少用到,在查看资料时,发现有两种方式

打开文件的方式在ios类(所以流式I/O的基类)中定义,有如下几种方式:

 

ios::in为输入(读)而打开文件
ios::out为输出(写)而打开文件
ios::ate初始位置:文件尾
ios::app所有输出附加在文件末尾
ios::trunc如果文件已存在则先删除该文件
ios::binary二进制方式

这些方式是能够进行组合使用的,以“或”运算(“|”)的方式:例如

ofstream out;  
out.open("Hello.txt", ios::in|ios::out|ios::binary)   //根据自己需要进行适当的选取  

打开文件的属性同样在ios类中也有定义:

0普通文件,打开操作
1只读文件
2隐含文件
4系统文件

对于文件的属性也可以使用“或”运算和“+”进行组合使用,这里就不做说明了。

 

C++写文件示例程序:

#include <iostream>
#include <string>
#include <fstream>

using namespace std;

//ios_base::trunc - 如果文件已存在则先删除该文件

int main()
{
    string filename = "student.txt";
#if 1   //方式一,创建默认文件输出流对象
    ofstream outFile;
    outFile.open(filename.c_str(),ios_base::trunc | ios_base::out); //2,以清空写方式打开文件
#endif

#if 0   //方式二:创建指定文件和以清空写文本文件的方式
    ofstream outFile(filename.c_str());
#endif

#if 0   //方式三:创建文件输入出流对象,并且以指定清空写方式打字符文件
    ofstream outFile(filename.c_str(),ios_base::trunc | ios_base::out);
#endif

    if(outFile.is_open())   //3,判断文件是否打开  成功打开,返回true
    {

#if 0
        outFile.put('C');   //4,写入单个字符
        outFile.flush();  //清空缓冲区
#endif

#if 0
        string str = "hello world";
        outFile.write(str.c_str(),str.length());    //5,写入字符串
        outFile.flush();
#endif

#if 1
        int value = 100;        //6,使用<<,写入字符串
        string str = "hello world";
        float f = 3.14f;
        outFile << value << " " <<str  << " " << f << endl; //6,同时写入各种不同类型数据
        outFile.flush();
#endif
    }

    outFile.close();    //7,关闭文件

}

 

C++读文件示例:

#include <iostream>
#include <string>
#include <fstream>
#include <string.h>

using namespace std;

//filename.c_str()  c_str()将str转换成const char *

int main()
{
    string filename = "student.txt";

#if 0   //创建默认的ifstream对象
    ifstream in;
    in.open(filename.c_str(),ios_base::in);
#endif

#if 0   //创建ifstream对象,并指定到某一个文件,默认打开字符文件
    ifstream in(filename.c_str());
#endif

    //创建ifstream对象,并指定到某一个文件,并以指定方式打开文件
    ifstream in(filename.c_str(),ios_base::in);
    char buf[128] = {0};

    if(in.is_open())
    {
#if 0
        char ch = in.get();     //读一个字符
        cout << "ch = " << ch << endl;
#endif

#if 0
        memset(buf,0,sizeof(buf));
        in.getline(buf,sizeof(buf) - 1);    //只能读一行
        cout << buf << endl;
#endif

#if 1
        int len;
        len = in.tellg();
        cout << "len=" << len << endl;

        //in.seekg(0,ios_base::end);  //移动读写指针到从文件尾开始的第0个字节处
        in.seekg(2,ios_base::beg);  //移动读写指针到从文件头开始的第2个字节处
        memset(buf,0,sizeof(buf));
        in.read(buf,sizeof(buf) - 1);       //可以从缓冲区读取,也能从文件中直接读取
        cout << buf << endl;
#endif

#if 0
        cout << "in.gcount() = " << in.gcount() <<  endl;       //gcount用于检查缓冲区内可读字节数
        memset(buf,0,sizeof(buf));
        in.read(buf,sizeof(buf) - 1);
        cout << "in.gcount() = " << in.gcount() <<  endl;
        in.readsome(buf,in.gcount());   //只能从缓冲区读取内容
        cout << buf << endl;
#endif

#if 0
        //file: 100 hello world 3.14
        string str1,str2,str3;
        in >> str1 >> str2 >> str3;     //使用>>每次从文件读一个单词,以空格或'\n'为分隔符
        cout << str1 << endl;   //100
        cout << str2 << endl;   //hello
        cout << str3 << endl;   //world
#endif

#if 0
        char ch;
        while(!in.eof())        //eof()函数用于检查是否到达文件结尾
        {
            ch = in.get();
            cout << ch;
        }
#endif

#if 0
        while(!in.eof())
        {
            memset(buf,0,sizeof(buf));
            in.getline(buf,sizeof(buf) - 1);    //读取一行,但是不会读换行符
            cout << buf << endl;
        }
#endif

#if 0
        while(!in.eof())
        {
            memset(buf,0,sizeof(buf));
            in.read(buf,sizeof(buf) - 1);
            cout << buf;
        }
        cout << endl;
#endif



#if 0
    string str;
    while(!in.eof())
    {
        in >> str;
        cout << str << endl;
    }
#endif

    in.close();
    }
}

 

 3. 文件读写示例:

#include <iostream>
#include <string>
#include <fstream>
#include <string.h>
#include <vector>

using namespace std;

//filename.c_str()  c_str()将str转换成const char *

class student
{
public:
    student();

    student(string name,int age)
    {
        this->name = name;
        this->age = age;
    }

    void showStudent()
    {
        cout << this->name << " " << this->age << endl;
    }

private:
    string name;
    int age;
};

student::student():name(""),age(0)
{
}

int main()
{
    string filename = "test.txt";
    char buf[128] = {0};

    //创建存储学生结构体的vector
    vector<student> vecStu;
    //添加学生到vector
    vecStu.push_back(student("li",12));
    vecStu.push_back(student("wang",21));
    vecStu.push_back(student("sun",41));

    //创建输出文件流
    ofstream out(filename.c_str(),ios_base::trunc | ios_base::binary);
    if(!out.is_open())
    {
        cout << "ofstream open error!" << endl;
        exit(-1);
    }

    //将学生vector写入到输出文件流out
    for(int i=0;i<vecStu.size();i++)
        out.write((char *)&vecStu.at(i),sizeof(student));

    out.close();

    //--------------------------------------------------------------------

    //创建ifstream对象,并指定到某一个文件,并以指定方式打开文件
    ifstream in(filename.c_str(),ios_base::binary);

    if(!in.is_open())
    {
        cout << "ifstream open error!" << endl;
        exit(-1);
    }

    vector <student> vecDest; //将读取的学生存入vecDest
    student temp;
    while(!in.eof())
    {
        if(in.read((char*)&temp,sizeof(student)))
            vecDest.push_back(temp);
    }

    for(int i=0;i<vecDest.size();i++)
        vecDest.at(i).showStudent();

    in.close();
}

 

 

转载于:https://www.cnblogs.com/linuxAndMcu/p/8338359.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值