C++ 随机访问二进制数据文件的问题。。。。
structtemp{charname[10];intn;};tempa={"zhangsan",14};把a存到文件"1.dat"中。问题来了,我要从这个文件中,读出1...
struct temp
{char name[10];
int n;};
temp a={"zhangsan",14};
把a存到文件"1.dat"中。
问题来了,我要从这个文件中,读出14这个数,应该怎么操作?
(用fstream的成员函数read,write) 展开
{char name[10];
int n;};
temp a={"zhangsan",14};
把a存到文件"1.dat"中。
问题来了,我要从这个文件中,读出14这个数,应该怎么操作?
(用fstream的成员函数read,write) 展开
展开全部
你的这个要求比较苛刻,或者说无法实现!我给你提供几个解决方案吧!
1:用文本文件,每个项目用特定的字符隔开,比如逗号,空格之类的
2:还是二进制保存,但是还是用一个特定的数来隔开,一般选一个不常用的数,比如0xff(255),
当然这两个方案都会遇到一个问题就是你要保存的数据出现用来颂圆分割的字符或数据时要转义,类似于源代码中\\代表\一样,但是要是分隔符选取得当的话也可以不实现转义
3:还有一个方案,就是定唯尘长,比如你这里的这个结构体,那么可以name保存10个字节,int保存4个字节,temp a={"zhangsan"指樱禅,14};保存为7a68616e6773616e00000000000e(我写的16进制数,也就是zhangsan\0\00x0000000e,相信你能理解),这样你每次读14个字节,前10个字节就是name,字符串,后4个字节就是n,int型!
你自己考虑下用那个方案,源码我就不给你写了!
1:用文本文件,每个项目用特定的字符隔开,比如逗号,空格之类的
2:还是二进制保存,但是还是用一个特定的数来隔开,一般选一个不常用的数,比如0xff(255),
当然这两个方案都会遇到一个问题就是你要保存的数据出现用来颂圆分割的字符或数据时要转义,类似于源代码中\\代表\一样,但是要是分隔符选取得当的话也可以不实现转义
3:还有一个方案,就是定唯尘长,比如你这里的这个结构体,那么可以name保存10个字节,int保存4个字节,temp a={"zhangsan"指樱禅,14};保存为7a68616e6773616e00000000000e(我写的16进制数,也就是zhangsan\0\00x0000000e,相信你能理解),这样你每次读14个字节,前10个字节就是name,字符串,后4个字节就是n,int型!
你自己考虑下用那个方案,源码我就不给你写了!
展开全部
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
struct temp
{
char name[10];
int n;
};
void write(const temp& a)
{
ofstream fout("1.dat",ios::binary);
fout.write(reinterpret_cast<const char*>(&(a.name)),10);
fout.write(reinterpret_cast<const char*> (&(a.n)),sizeof(int));
}
void read(temp& a)
{
ifstream fin("1.dat");
fin.read(reinterpret_cast<char*>(&(a.name)),10);
fin.read(reinterpret_cast<char*>(&(a.n)),sizeof(int));
}
int main()
{
temp a={"森雹zhangsan",14},b;
write(a);
read(b);
cout<<b.name<链春亩<b.n<<endl;
}
zhangsan14
请按棚森任意键继续. . .
#include <string>
#include <fstream>
using namespace std;
struct temp
{
char name[10];
int n;
};
void write(const temp& a)
{
ofstream fout("1.dat",ios::binary);
fout.write(reinterpret_cast<const char*>(&(a.name)),10);
fout.write(reinterpret_cast<const char*> (&(a.n)),sizeof(int));
}
void read(temp& a)
{
ifstream fin("1.dat");
fin.read(reinterpret_cast<char*>(&(a.name)),10);
fin.read(reinterpret_cast<char*>(&(a.n)),sizeof(int));
}
int main()
{
temp a={"森雹zhangsan",14},b;
write(a);
read(b);
cout<<b.name<链春亩<b.n<<endl;
}
zhangsan14
请按棚森任意键继续. . .
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你更苛刻的要求,或无法镇键散亮毁实现!我给你几个解决方案!
1:与特定的字符,如逗号分隔的文本文件,每个项目,空间,如
2:或二进制保存,但仍与一个具体的数字分离一般选举使用的号码,如为0xFF(255)
当然,这两个程序会遇到一个问题,你要保存所使用的数据分割为了逃避,在源代码中的字符或数据类似于\ \ \相同,但如果选择了正确的分离字符不能逃脱
3:还有一个程序长,如你在这里的御氏结构,你可以保存10 - 组的名称,诠释节省4个字节,温度= {“张三”,14};保存7a68616e6773616e00000000000e(我写的十六进制数是张三\ 0 \ 00x0000000e,我相信你能理解),所以每次读14个字节10字节的名称,字符串,4个字节是n,int类型!
你认为自己是根据该程序的源代码,我不给你写信!
1:与特定的字符,如逗号分隔的文本文件,每个项目,空间,如
2:或二进制保存,但仍与一个具体的数字分离一般选举使用的号码,如为0xFF(255)
当然,这两个程序会遇到一个问题,你要保存所使用的数据分割为了逃避,在源代码中的字符或数据类似于\ \ \相同,但如果选择了正确的分离字符不能逃脱
3:还有一个程序长,如你在这里的御氏结构,你可以保存10 - 组的名称,诠释节省4个字节,温度= {“张三”,14};保存7a68616e6773616e00000000000e(我写的十六进制数是张三\ 0 \ 00x0000000e,我相信你能理解),所以每次读14个字节10字节的名称,字符串,4个字节是n,int类型!
你认为自己是根据该程序的源代码,我不给你写信!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询