返回信息流先说下我作的东西:
想做一个小型的数据库,中间要用到对文件内的记录的读写,我把定长记录设计成一个个对象,读的时候根据记录的大小算出应当从什么位置读,然后从那个位置开始读一个对象出来,结果发现第一遍读时没有问题,结果第2遍关闭文件后再读就成下面这样了,请达人指教...
第一遍向文件中写入3个对象,然后读出第一个对象并打印:
#include<iostream>
#include<string>
#include<fstream>
using namespace std;
class test
{
public:
int i;
char a;
int get() { return i; }
};
int main()
{
ofstream fout("D:\\test.dat",ios_base::binary);
if(fout.fail()) { cout<<"Cannot open file!"<<endl; return 0;}
test t1,t2,t3; //文件对对象的读写,先向文件里连续写入3个对象,再读出来,结果正常
t1.a='a';
t1.i=10;
t2.a='b';
t2.i=11;
t3.a='c';
t3.i=12;
fout.write((char*)&t1,sizeof(test));
fout.write((char*)&t2,sizeof(test));
fout.write((char*)&t3,sizeof(test));
fout.close();
ifstream fin("D:\\test.dat",ios_base::binary);
test t4;
fin.read((char*)&t4,sizeof(test));
cout<<t4.a<<t4.i<<endl;
fin.close();
return 0;
}
关闭文件后重新读取文件存储的对象,结果就读不出来了... 请教达人
(另外,若我打算覆盖文件中的某个对象,是直接用seekp将写指针移到某个对象的开始处然后写个对象进去直接覆盖吗? 请教)
#include<iostream>
#include<string>
#include<fstream>
using namespace std;
class test
{
public:
int i;
char a;
int get() { return i; }
};
int main()
{
ofstream fout("D:\\test.dat",ios_base::binary);
if(fout.fail()) { cout<<"Cannot open file!"<<endl; return 0;}
ifstream fin("D:\\test.dat",ios_base::binary);
test t;
fin.read((char*)&t,sizeof(test));
cout<<t.a<<t.i<<endl;
fin.close();
return 0;
}
这是一条镜像帖。来源:北邮人论坛 / cpp / #13676同步于 2008/10/9
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
请教达人们关于文件里对象的定位读写
Cloudeagle
2008/10/9镜像同步10 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
【 在 ericyosho 的大作中提到: 】
: 好好的,怎么读不出来了?
准确的说,读出来的是乱玛.....
原文件里写入的是 a10b11c12 ,结果关闭文件后读出来的是乱吗
【 在 ericyosho 的大作中提到: 】
: 你得把你的代码,还有具体的操作步骤贴出来啊。
: 不说出来,没有人知道你怎么操作的……
汗,我现在还在写实验的代码,就用上面贴的小程序进行实验,结果就不对了,你跑跑上面的程序看下
试了下
第二段程序没问题呀
【 在 lblz 的大作中提到: 】
: 汗,我现在还在写实验的代码,就用上面贴的小程序进行实验,结果就不对了,你跑跑上面的程序看下
有点问题,按照你上面的代码来测试,出来的是乱码,是因为这是test.dat所有的内容已经被清空了,是一个0字节的空白文件。
用ofstream打开已有的文件,文件内容被自动清空。
我把第二段代码的ofstream那两行去掉,就可以正常工作了。
晕
在linux下试的
把那个“D:\\test.dat”改成t.dat了
测试第二段代码时又把第一个文件名敲成t.data了
于是结果正常~~
re 6楼
先ofstream的话
内容就被清了
【 在 ericyosho 的大作中提到: 】
: 有点问题,按照你上面的代码来测试,出来的是乱码,是因为这是test.dat所有的内容已经被清空了,是一个0字节的空白文件。
: 用ofstream打开已有的文件,文件内容被自动清空。
: 我把第二段代码的ofstream那两行去掉,就可以正常工作了。
我晕,原来如此,是不是只要以O形式打开的文件对象,都会先清空,比如用fstream的ios::out参数时?
【 在 ericyosho 的大作中提到: 】
: 有点问题,按照你上面的代码来测试,出来的是乱码,是因为这是test.dat所有的内容已经被清空了,是一个0字节的空白文件。
: 用ofstream打开已有的文件,文件内容被自动清空。
: 我把第二段代码的ofstream那两行去掉,就可以正常工作了。
这样的话,那怎么修改文件啊? 一用ofstream打开就清空文件的内容,那怎么修改替换文件的内容啊??????