C++从文件中读取对象
C++中,怎样从一个文件中(已存在)读取若干对象,然后保存到一个对象数组里?各对象保存到一个数组里后,还要能继续对其操作,(比如,查找,删除,不过这些我自己会弄的)只要能...
C++中,怎样从一个文件中(已存在)读取若干对象,然后保存到一个对象数组里?
各对象保存到一个数组里后,还要能继续对其操作,(比如,查找,删除,不过这些我自己会弄的)只要能使其继续操作就好.
还有,如果是用for循环,那第二个条件怎么写呢?就是怎么判断是否到达了文件尾. 展开
各对象保存到一个数组里后,还要能继续对其操作,(比如,查找,删除,不过这些我自己会弄的)只要能使其继续操作就好.
还有,如果是用for循环,那第二个条件怎么写呢?就是怎么判断是否到达了文件尾. 展开
3个回答
展开全部
首先对你的问题进行分析,“怎样从一个文件中(已存在)读取若干对象,然后保存到一个对象数组里”
分为两大块,一个是读取已有文件,另一个是保存到对象数组中!
一、1.读取的文件有二进制文件和文本文件,这里介绍为了快速读取的二进制文件(缺点是你打开那文件,读不懂,文本文件可以很方便的看到,但是只要修改参数,一样的!)
2.读取对象,那么就是数据块的读写,所以就不说单字符,随机的方式了!
有两个函数!
读文件 istream &read(unsigned char* buf,int num);
写文件 ostream &write(unsigned char* buf,int num);
buf这个参数就是你的对象数组的指针,num就是你要读取的数据快字节数(可以用sizeof()来获得,比如你的对象是user1,其类是User,那么读取一个对象就是sizeof(User),可以用for循环来读取多个!)
二、保存到对象数组!这个应该很简单了,前面的buf指针指向这个数组就好了!举个具体的例子!
#include <fstream.h>
#include<iostream.h>
#include<string.h>
class User
{
public: //为了简单,设为公有的了!你可以设一个函数来存储数据,这样可以访问私有
int num;
int age;
};
main()
{
ofstream out("test"); // ofstream 是输出文件流与下面的对应
if(!out)
{
cout<<"不能建立文件\n";
return 1;
}
User user1,user2;
user1.num=100;
user1.age=20;
out.write((char *) &user1.num,sizeof(int)); //这个是具体的写如过程
out.write((char *) &user1.age,sizeof(int));
out.close();
ifstream in("test"); // 同上的,是一个输入文件流
if(!in)
{
cout<<"不能打开文件\n";
return 1;
}
in.read((char *) &user2.num,sizeof(int));//读取刚才所存的对象,实现多个的可以用for循环!
in.read((char *) &user2.age,sizeof(int));
cout<<user2.num<<" "<<user2.age<<endl;
in.close();
return 0;
}
验证过了,可以的!!!!
for循环可以不一定要到文件尾啊,可以是你只想读出的对象数啊!
在文件结束位置有个标志位,EOF,使用eof()可以检测到,如你已经声明好的了
in.eof()到文件尾了,则返回1,没有则是0!
分为两大块,一个是读取已有文件,另一个是保存到对象数组中!
一、1.读取的文件有二进制文件和文本文件,这里介绍为了快速读取的二进制文件(缺点是你打开那文件,读不懂,文本文件可以很方便的看到,但是只要修改参数,一样的!)
2.读取对象,那么就是数据块的读写,所以就不说单字符,随机的方式了!
有两个函数!
读文件 istream &read(unsigned char* buf,int num);
写文件 ostream &write(unsigned char* buf,int num);
buf这个参数就是你的对象数组的指针,num就是你要读取的数据快字节数(可以用sizeof()来获得,比如你的对象是user1,其类是User,那么读取一个对象就是sizeof(User),可以用for循环来读取多个!)
二、保存到对象数组!这个应该很简单了,前面的buf指针指向这个数组就好了!举个具体的例子!
#include <fstream.h>
#include<iostream.h>
#include<string.h>
class User
{
public: //为了简单,设为公有的了!你可以设一个函数来存储数据,这样可以访问私有
int num;
int age;
};
main()
{
ofstream out("test"); // ofstream 是输出文件流与下面的对应
if(!out)
{
cout<<"不能建立文件\n";
return 1;
}
User user1,user2;
user1.num=100;
user1.age=20;
out.write((char *) &user1.num,sizeof(int)); //这个是具体的写如过程
out.write((char *) &user1.age,sizeof(int));
out.close();
ifstream in("test"); // 同上的,是一个输入文件流
if(!in)
{
cout<<"不能打开文件\n";
return 1;
}
in.read((char *) &user2.num,sizeof(int));//读取刚才所存的对象,实现多个的可以用for循环!
in.read((char *) &user2.age,sizeof(int));
cout<<user2.num<<" "<<user2.age<<endl;
in.close();
return 0;
}
验证过了,可以的!!!!
for循环可以不一定要到文件尾啊,可以是你只想读出的对象数啊!
在文件结束位置有个标志位,EOF,使用eof()可以检测到,如你已经声明好的了
in.eof()到文件尾了,则返回1,没有则是0!
展开全部
for循环,依次读取对象的各个数据成员,直到文件结束为止。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#include <fstream>
#include <iostream>
#include <cstring>
using namespace std;
class cat
{
public:
cat(int x)
{
m=x;
}
int m;
};
int main()
{
ofstream fout("1.txt",ios::binary);//二进制打开文件
if (!fout)
{
cout << "打开失败\n";
return(1);
}
cat one(50);
cout<<one.m<<endl;//one的m为50
fout.write((char *)&one,sizeof one);//从类one中写入到文件 就是把50的二进制写入到文件中
fout.close();
///////////////////
cat two(9991);//创建对象two 给构造函数传递9991
cout<<two.m<<endl;//two的m为9991
ifstream fin("1.txt",ios::binary);
if (!fout)
{
cout << "打开失败\n";
return(1);
}
fin.read((char *)&two,sizeof two);//从文件中读取数据到two对象中 文件中有一个50的二进制数字
fout.close();
cout<<two.m<<endl; //two.m 从9991变成50拉
fout.close();
cin.get();
return 0;
}
#include <iostream>
#include <cstring>
using namespace std;
class cat
{
public:
cat(int x)
{
m=x;
}
int m;
};
int main()
{
ofstream fout("1.txt",ios::binary);//二进制打开文件
if (!fout)
{
cout << "打开失败\n";
return(1);
}
cat one(50);
cout<<one.m<<endl;//one的m为50
fout.write((char *)&one,sizeof one);//从类one中写入到文件 就是把50的二进制写入到文件中
fout.close();
///////////////////
cat two(9991);//创建对象two 给构造函数传递9991
cout<<two.m<<endl;//two的m为9991
ifstream fin("1.txt",ios::binary);
if (!fout)
{
cout << "打开失败\n";
return(1);
}
fin.read((char *)&two,sizeof two);//从文件中读取数据到two对象中 文件中有一个50的二进制数字
fout.close();
cout<<two.m<<endl; //two.m 从9991变成50拉
fout.close();
cin.get();
return 0;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询