【C++练习】C++中读取.txt文件中的数据(由简到难)

1 将数据写入.txt文本中,再从.txt中读取到string字符串里,输出到终端

#include <iostream>
#include <fstream>//包头文件
using namespace std;

int main()
{
    //1. 创建流对象
    ofstream ofs;
    //2. 以写的方式打开文件(若文件不存在,则创建文件)(ios::out  清空文件,重新写入)
    ofs.open("D:/hqyj/QTtxt/day7/stu.txt",ios::out);
    //3. 向文件中写入数据
    ofs << "姓名:张三" << endl;
    ofs << "年龄:34" << endl;
    //4. 关闭文件
    ofs.close();

    //1. 创建流对象
    ifstream ifs;
    //2. 以读的方式打开文件(若文件不存在,则段错误)
    ifs.open("D:/hqyj/QTtxt/day7/stu.txt",ios::in);
    //3. 从文件中读取数据
    char buf[1024];
    while(ifs>>buf)
    {
        cout << buf << endl;
    }
    //4. 关闭文件
    ifs.close();

    return 0;
}

2 试编程:将实例化类对象写入容器后,写入.txt文本中,再重新定义一个类容器,将.txt中的内容读取出来,输出到终端

封装一个学生的类,定义一个学生这样类的vector容器, 里面存放学生对象(至少3个)

再把该容器中的对象,保存到文件中。

再把这些学生从文件中读取出来,放入另一个容器中并且遍历输出该容器里的学生。

方法一(使用string类型的容器读取)

#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
class Stu
{
private:
    string name;
    int id;
public:
    //无参构造函数
    Stu() {}
    //有参构造函数
    Stu(string n, int i):name(n),id(i){}
    string getname()
    {
        return name;
    }
    int getid()
    {
        return id;
    }
};
int main()
{
    Stu s1("张三",1001);
    Stu s2("李四",1002);
    Stu s3("王五",1003);
    Stu s4("赵六",1004);
    Stu s5("小明",1005);
    vector<Stu> v;//无参构造函数
    v.push_back(s1);//尾插
    v.push_back(s2);
    v.push_back(s3);
    v.push_back(s4);
    v.push_back(s5);

    //创建一个流对象
    ofstream osf;
    //以写的方式打开文件
    osf.open("D:/hqyj/QTtxt/day7/stu.txt",ios::out);
    //写入数据
    for(int i=0;i<5;i++)
    {
        osf << v.at(i).getname() << " " << v.at(i).getid() << endl;
    }
    //关闭文件
    osf.close();

    //创建一个流对象
    ifstream isf;
    //以读的方式打开文件
    isf.open("D:/hqyj/QTtxt/day7/stu.txt",ios::in);
    //读取数据
    //创建一个新的容器存放读取到的数据
    vector<Stu> stu;
    string buf;//将从文件中的数据暂存到buf中
    while(getline(isf,buf))//当读不到数据时退出循环
    {
        isf >> buf;//从文件中读取
        stu.push_back(buf);//写入到容器中
    }
    for(int i=0;i<stu.size();i++)
    {
        cout << stu.at(i);
        cout << endl;
    }
    //关闭文件
    isf.close();

    return 0;
}

方法二(使用类容器读取)

#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
class Stu
{
private:
    string name;
    int id;
public:
    //无参构造函数
    Stu() {}
    //有参构造函数
    Stu(string n, int i):name(n),id(i){}
    string getname()
    {
        return name;
    }
    int getid()
    {
        return id;
    }
};
int main()
{
    Stu s1("张三",1001);
    Stu s2("李四",1002);
    Stu s3("王五",1003);
    Stu s4("赵六",1004);
    Stu s5("小明",1005);
    vector<Stu> v;//无参构造函数
    v.push_back(s1);//尾插
    v.push_back(s2);
    v.push_back(s3);
    v.push_back(s4);
    v.push_back(s5);

    //创建一个流对象
    ofstream osf;
    //以写的方式打开文件
    osf.open("D:/hqyj/QTtxt/day7/stu.txt",ios::out);
    //写入数据
    for(int i=0;i<5;i++)
    {
        osf << v.at(i).getname() << " " << v.at(i).getid() << endl;
    }
    //关闭文件
    osf.close();

    //创建一个流对象
    ifstream isf;
    //以读的方式打开文件
    isf.open("D:/hqyj/QTtxt/day7/stu.txt",ios::in);
    //读取数据
    //创建一个新的容器存放读取到的数据
    vector<Stu> stu;
    string buf;//将从文件中的数据暂存到buf中
    while(getline(isf,buf))//使用getline函数从文件流isf中逐行读取数据,并将每一行的内容存储在字符串变量buf中
    {
        string name = buf.substr(0,buf.length()-4);//使用substr函数从读取到的每一行中提取出姓名部分。line.length() - 4表示从当前行的开头截取到倒数第4个字符之前,剩下的部分即为姓名。
        int id = atoi(buf.substr(buf.length()-4).c_str());//使用substr函数和atoi函数从读取到的每一行中提取出学号部分。line.length() - 4表示从当前行的末尾4个字符开始截取,剩下的部分即为学号。atoi函数将提取到的学号转换为整数。

        Stu s(name,id);//使用从文件中提取得到的姓名和学号实例化一个Stu对象
        stu.push_back(s);//尾插,将创建的学生对象添加到容器v的末尾
    }
    for(int i=0;i<stu.size();i++)
    {
        cout << stu[i].getname() << stu[i].getid() << endl;
    }
    //关闭文件
    isf.close();

    return 0;
}

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值