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;
}