(100分)C++定义了类A,在类中又有string类的对象,怎样把这种类A写入和读出文件

给出适当的例子,说明清楚,采纳了以后继续加分,谢绝在网上复制大批量文字和代码
再补充一下。像这样的类怎么写入文件和读出文件;
#include<fstream>
#include<string>
#include<iostream>
using namespace std;
class A
{
private:
float a;
string str1;
string str2;
pubulic:
A(){..}
void fun(){....}
};
class B
{
private:
A type;
int c;
doulble d;
string str3;
string str4;
};
int main()
{ B m;
//以下就是对象m的数据输入,并把m写入文件和从文件读出(重点)
return 0;
}
我现在想知道的是怎样把类B的对象m中的数据正确地写入文件和读出文件(对象m的数据已经通过cin输入了)

……真是形形色色的回答, rpfax31 这位老兄居然“闪存”都出来了=_= 。 要得分有毛的用?
首先,我希望楼主你知道C++里面的“文件流”以及怎样操作使用文件。
然后,你可以在A类或B类里面重载 "<<" 流插入运算符,这样,你就可以像一般的类型一样直接用了:
譬如:
A a;
cout << a;

不用文件流也可以,假如你知道重定向 用 you.exe > out.txt,把cout 重定向到out.txt当中(you.exe是你生成的exe程序名),这样,原本写在控制台上的数据就全被定向到你自己指定的文本文件当中了。
要读入的话,用 you.exe <in.txt
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-12-09
(PS:从问题猜的,楼主知道如何把 string 写入和读出文件。)
首先考虑文件的结构。通常文件数据由有限多个“数据节点”组成,每个“数据节点”分为 head 和 data 。Head 中通常至少包括数据的 type 、length 等信息,其中 type 通常用“枚举”来表示,用于标记如何解析该“数据节点”。
通常“数据节点”只表示一个“元数据”(类似 int,double 等,当然也包括 string ),如果要表示一个组合数据(类似楼主说的 A )的话,可以在多个数据节点前加一个数据节点,来表示后面 n 个节点属于该组合数据。
简单写一个 head (通常要比这复杂很多):
typedef enum {
Type_char = 0,
Type_int = 1,
Type_double = 2,
Type_string = 3,
Type_A = 33
} DataType;

typedef struct
{
DataType dataType;
unsigned int length;
} head;

例 1,用 12 个字节表示 5 (int 型):
1 0 0 0 4 0 0 0 5 0 0 0
其中,前四个字节 1 0 0 0 表示 dataType,是 Type_int ,所以按照 int 类型解读,中间四个字节为 4 0 0 0,表示长度是 4,后面 5 0 0 0 表示该数字为 5 。

例 2,用 14 个字节表示 "abcde" (string 类型):
3 0 0 0 6 0 0 0 97 98 99 100 101 0
其中,3 0 0 0 为 Type_int ,6 0 0 0 表示后面还有 6 个字节在 string 中,后面是内容。

例 3,A 的声明为:
typedef struct
{
int i;
string s;
} A;
如果 A 的某个对象包含一个 int 的 5,和一个 string 的 "abcde" ,则可以表示为:
33 0 0 0 0 0 0 0 1 0 0 0 4 0 0 0 5 0 0 0 3 0 0 0 6 0 0 0 97 98 99 100 101 0
其中,33 0 0 0 为 Type_A ,接着的 0 0 0 0 表示长度,该数据节点并没有真实数据,只是一个 type 声明(用来声明后面的两个节点应该是一个 int 和一个 string ,都是 A 的内容),所以数据长度为 0 ,当然,这个看个人喜好。本回答被网友采纳
第2个回答  2013-01-04
写入:A a(...);
file.write((char*) &a,sizeof(A));
读取:A *b = new A();
file.read((char*) b,sizeof(A));
//还必须用类的指针(类中含有string),不然运行时错误(有关std::string的内存共享问题)

关键是不管string有多大,比如100多个字符,用read,write函数时sizeof(A)都不变化,他还能写入。。。

真神奇!!!!!!!!楼主现在知道实现原理了么?

满意回答的那人的确可以实现,实现起来是比较方便(重载<<,>>运算符就可以),但是浪费了大量空间,而且查找效率低下。。。。

好吧,我又有新发现,当string非常大时,哪怕是几千字节都没事,只要是在同一个程序中进行读取,就没有问题。。。
而一旦哪怕是几百字节,放到两个不同的程序中分别进行读和写就Crash了。。。。
代码参见
http://blog.csdn.net/zhuqi12580/article/details/8464437
第3个回答  2010-12-09
用二进制读写吧,指定长度, 类A是成员类 比较麻烦一点 写个fun() 读取类A的长度 然后写入时候先写入长度 然后写入 读取的时候 先读取长度 然后读取内容 类似于报文头的道理 这么弄稳妥一些 具体实现 依照要求会有所区别
第4个回答  2010-12-09
class B
{
private:
A type;
int c;
doulble d;
string str3;
string str4;
}
以上的类中的变量都是private 啊,怎么写数据啊。
第5个回答  2010-12-10
闪存(Flash Memory)

闪存是一种长寿命的非易失性(在断电情况下仍能保持所存储的数据信息)的存储器,数据删除不是以单个的字节为单位而是以固定的区块为单位,区块大小一般为256KB到20MB。闪存是电可擦除只读存储器(EEPROM)的变种, EEPROM与闪存不同的是,它能在字节水平上进行删除和重写而不是整个芯片擦写,这样闪存就比EEPROM的更新速度快。由于其断电时仍能保存数据,闪存通常被用来保存设置信息,如在电脑的BIOS、PDA、数码相机中保存资料等。另一方面,闪存不像RAM一样以字节为单位改写数据,因此不能取代RAM。

闪存的分类

NOR型与NAND型闪存的区别很大,打个比方说,NOR型闪存更像内存,有独立的地址线和数据线,但价格比较贵,容量比较小;而NAND型更像硬盘,地址线和数据线是共用的I/O线,类似硬盘的所有信息都通过一条硬盘线传送一般,而且NAND型与NOR型闪存相比,成本要低一些,而容量大得多。因此, NOR型闪存比较适合频繁随机读写的场合,通常用于存储程序代码并直接在闪存内运行,手机就是使用NOR型闪存的大户,所以手机的“内存”容量通常不大; NAND型闪存主要用来存储资料,我们常用的闪存产品,如闪存盘、数码存储卡都是用NAND型闪存。

这里我们还需要端正一个概念,那就是闪存的速度其实很有限,它本身操作速度、频率就比内存低得多,而且NAND型闪存类似硬盘的操作方式效率也比内存的直接访问方式慢得多。因此,不要以为闪存盘的性能瓶颈是在接口,甚至想当然地认为闪存盘采用USB2.0接口之后会获得巨大的性能提升。

前面提到NAND型闪存的操作方式效率低,这和它的架构设计和接口设计有关,它操作起来确实挺像硬盘(其实NAND型闪存在设计之初确实考虑了与硬盘的兼容性),它的性能特点也很像硬盘:小数据块操作速度很慢,而大数据块速度就很快,这种差异远比其他存储介质大的多。这种性能特点非常值得我们留意。

NAND型闪存的技术特点

内存和NOR型闪存的基本存储单元是bit,用户可以随机访问任何一个bit的信息。而NAND型闪存的基本存储单元是页(Page)(可以看到,NAND型闪存的页就类似硬盘的扇区,硬盘的一个扇区也为512字节)。每一页的有效容量是512字节的倍数。所谓的有效容量是指用于数据存储的部分,实际上还要加上16字节的校验信息,因此我们可以在闪存厂商的技术资料当中看到“(512+16)Byte”的表示方式。目前2Gb以下容量的 NAND型闪存绝大多数是(512+16)字节的页面容量,2Gb以上容量的NAND型闪存则将页容量扩大到(2048+64)字节。

NAND型闪存以块为单位进行擦除操作。闪存的写入操作必须在空白区域进行,如果目标区域已经有数据,必须先擦除后写入,因此擦除操作是闪存的基本操作。一般每个块包含32个512字节的页,容量16KB;而大容量闪存采用2KB页时,则每个块包含64个页,容量128KB。

每颗NAND型闪存的I/O接口一般是8条,每条数据线每次传输(512+16)bit信息,8条就是(512+16)×8bit,也就是前面说的512 字节。但较大容量的NAND型闪存也越来越多地采用16条I/O线的设计,如三星编号K9K1G16U0A的芯片就是64M×16bit的NAND型闪存,容量1Gb,基本数据单位是(256+8)×16bit,还是512字节。

寻址时,NAND型闪存通过8条I/O接口数据线传输地址信息包,每包传送8位地址信息。由于闪存芯片容量比较大,一组8位地址只够寻址256个页,显然是不够的,因此通常一次地址传送需要分若干组,占用若干个时钟周期。NAND的地址信息包括列地址(页面中的起始操作地址)、块地址和相应的页面地址,传送时分别分组,至少需要三次,占用三个周期。随着容量的增大,地址信息会更多,需要占用更多的时钟周期传输,因此NAND型闪存的一个重要特点就是容量越大,寻址时间越长。而且,由于传送地址周期比其他存储介质长,因此NAND型闪存比其他存储介质更不适合大量的小容量读写请求。

决定NAND型闪存的因素有哪些?

1.页数量

前面已经提到,越大容量闪存的页越多、页越大,寻址时间越长。但这个时间的延长不是线性关系,而是一个一个的台阶变化的。譬如128、256Mb的芯片需要3个周期传送地址信号,512Mb、1Gb的需要4个周期,而2、4Gb的需要5个周期。

2.页容量

每一页的容量决定了一次可以传输的数据量,因此大容量的页有更好的性能。前面提到大容量闪存(4Gb)提高了页的容量,从512字节提高到2KB。页容量的提高不但易于提高容量,更可以提高传输性能。我们可以举例子说明。以三星K9K1G08U0M和K9K4G08U0M为例,前者为1Gb,512字节页容量,随机读(稳定)时间12μs,写时间为200μs;后者为4Gb,2KB页容量,随机读(稳定)时间25μs,写时间为300μs。假设它们工作在 20MHz。

读取性能:NAND型闪存的读取步骤分为:发送命令和寻址信息→将数据传向页面寄存器(随机读稳定时间)→数据传出(每周期8bit,需要传送512+16或2K+64次)。

K9K1G08U0M读一个页需要:5个命令、寻址周期×50ns+12μs+(512+16)×50ns=38.7μs;K9K1G08U0M实际读传输率:512字节÷38.7μs=13.2MB/s;K9K4G08U0M读一个页需要:6个命令、寻址周期×50ns+25μs+(2K+64)× 50ns=131.1μs;K9K4G08U0M实际读传输率:2KB字节÷131.1μs=15.6MB/s。因此,采用2KB页容量比512字节也容量约提高读性能20%。

写入性能:NAND型闪存的写步骤分为:发送寻址信息→将数据传向页面寄存器→发送命令信息→数据从寄存器写入页面。其中命令周期也是一个,我们下面将其和寻址周期合并,但这两个部分并非连续的。

K9K1G08U0M写一个页需要:5个命令、寻址周期×50ns+(512+16)×50ns+200μs=226.7μs。K9K1G08U0M实际写传输率:512字节÷226.7μs=2.2MB/s。K9K4G08U0M写一个页需要:6个命令、寻址周期×50ns+(2K+64)×50ns+ 300μs=405.9μs。K9K4G08U0M实际写传输率:2112字节/405.9μs=5MB/s。因此,采用2KB页容量比512字节页容量提高写性能两倍以上。

3.块容量

块是擦除操作的基本单位,由于每个块的擦除时间几乎相同(擦除操作一般需要2ms,而之前若干周期的命令和地址信息占用的时间可以忽略不计),块的容量将直接决定擦除性能。大容量NAND型闪存的页容量提高,而每个块的页数量也有所提高,一般4Gb芯片的块容量为2KB×64个页=128KB,1Gb芯片的为512字节×32个页=16KB。可以看出,在相同时间之内,前者的擦速度为后者8倍!

4.I/O位宽

以往NAND型闪存的数据线一般为8条,不过从256Mb产品开始,就有16条数据线的产品出现了。但由于控制器等方面的原因,x16芯片实际应用的相对比较少,但将来数量上还是会呈上升趋势的。虽然x16的芯片在传送数据和地址信息时仍采用8位一组,占用的周期也不变,但传送数据时就以16位为一组,带宽增加一倍。K9K4G16U0M就是典型的64M×16芯片,它每页仍为2KB,但结构为(1K+32)×16bit。

模仿上面的计算,我们得到如下。K9K4G16U0M读一个页需要:6个命令、寻址周期×50ns+25μs+(1K+32)×50ns=78.1μs。 K9K4G16U0M实际读传输率:2KB字节÷78.1μs=26.2MB/s。K9K4G16U0M写一个页需要:6个命令、寻址周期×50ns+ (1K+32)×50ns+300μs=353.1μs。K9K4G16U0M实际写传输率:2KB字节÷353.1μs=5.8MB/s

可以看到,相同容量的芯片,将数据线增加到16条后,读性能提高近70%,写性能也提高16%。

5.频率

工作频率的影响很容易理解。NAND型闪存的工作频率在20~33MHz,频率越高性能越好。前面以K9K4G08U0M为例时,我们假设频率为20MHz,如果我们将频率提高一倍,达到40MHz,则

K9K4G08U0M读一个页需要:6个命令、寻址周期×25ns+25μs+(2K+64)×25ns=78μs。K9K4G08U0M实际读传输率: 2KB字节÷78μs=26.3MB/s。可以看到,如果K9K4G08U0M的工作频率从20MHz提高到40MHz,读性能可以提高近70%!当然,上面的例子只是为了方便计算而已。在三星实际的产品线中,可工作在较高频率下的应是K9XXG08UXM,而不是K9XXG08U0M,前者的频率目前可达33MHz。

6.制造工艺

制造工艺可以影响晶体管的密度,也对一些操作的时间有影响。譬如前面提到的写稳定和读稳定时间,它们在我们的计算当中占去了时间的重要部分,尤其是写入时。如果能够降低这些时间,就可以进一步提高性能。90nm的制造工艺能够改进性能吗?答案恐怕是否!目前的实际情况是,随着存储密度的提高,需要的读、写稳定时间是呈现上升趋势的。前面的计算所举的例子中就体现了这种趋势,否则4Gb芯片的性能提升更加明显。

综合来看,大容量的NAND型闪存芯片虽然寻址、操作时间会略长,但随着页容量的提高,有效传输率还是会大一些,大容量的芯片符合市场对容量、成本和性能的需求趋势。而增加数据线和提高频率,则是提高性能的最有效途径,但由于命令、地址信息占用操作周期,以及一些固定操作时间(如信号稳定时间等)等工艺、物理因素的影响,它们不会带来同比的性能提升。

1Page=(2K+64)Bytes;1Block=(2K+64)B×64Pages=(128K+4K)Bytes;1Device=(2K+64)B×64Pages×4096Blocks=4224Mbits

其中:A0~11对页内进行寻址,可以被理解为“列地址”。

A12~29对页进行寻址,可以被理解为“行地址”。为了方便,“列地址”和“行地址”分为两组传输,而不是将它们直接组合起来一个大组。因此每组在最后一个周期会有若干数据线无信息传输。没有利用的数据线保持低电平。NAND型闪存所谓的“行地址”和“列地址”不是我们在DRAM、SRAM中所熟悉的定义,只是一种相对方便的表达方式而已。为了便于理解,我们可以将上面三维的NAND型闪存芯片架构图在垂直方向做一个剖面,在这个剖面中套用二维的 “行”、“列”概念就比较直观了。

闪存的应用及前景

“优盘” 时闪存走进日常生活的最明显写照,其实早在U盘之前,闪存已经出现在许多电子产品之中。传统的存储数据方式是采用RAM的易失存储,电池没电了数据就会丢失。采用闪存的产品,克服了这一毛病,使得数据存储更为可靠。除了闪存盘,闪存还被应用在计算机中的BIOS、PDA、数码相机、录音笔、手机、数字电视、游戏机等电子产品中。

追溯到1998年,优盘进入市场。接口由USB1.0发展到2.0,速度逐渐提高。U盘的盛行还间接促进了USB接口的推广。为什么U盘这么受到人们欢迎呢?

闪存盘可用来在电脑之间交换数据。从容量上讲,闪存盘的容量从16MB到2GB可选,突破了软驱1.44MB的局限性。从读写速度上讲,闪存盘采用USB接口,读写速度比软盘高许多。从稳定性上讲,闪存盘没有机械读写装置,避免了移动硬盘容易碰伤、跌落等原因造成的损坏。部分款式闪存盘具有加密等功能,令用户使用更具个性化。闪存盘外形小巧,更易于携带。且采用支持热插拔的USB接口,使用非常方便。

目前,闪存正朝大容量、低功耗、低成本的方向发展。与传统硬盘相比,闪存的读写速度高、功耗较低,目前市场上已经出现了闪存硬盘。随着制造工艺的提高、成本的降低,闪存将更多地出现在日常生活之中。

C++中vector和string类是怎么实现输入的?
void push_back(Char_type val); 用alloc.construct即new (pointer) Char_type(val);来实现 string operator+(const char* p);};}

为什么我在C++中的头文件中,类A下声明一下变量extern int test;会提示...
运行出错<br>这是一对实验(有没有a.cpp文件)<br><br>可得出这样的结论:<br>a.cpp中std::string i;是定义(本来就是)<br>b.cpp中extern std::string i; 则是声明(你的问题)<br><br>先别急,这只是实验结果。我们还需要理论依据,那么下面就试着解释一下:<br><br>下面是另一个...

C++中如何使用Filestream进行文本写入和读取操作?
private static void AddText(FileStream fs, String value){ byte[] info = (new UTF8Encoding(true)).GetBytes(value); fs.Write(info, 0, info.Length);}在main函数中,我们创建一个名为"MyTest.txt"的文件,如果文件已存在则先删除。然后,创建一个FileStream对象并使用AddText方法写入...

c++编程问题,string类型怎么赋值,怎么引用
1、不同编译环境下的C++,对字符串的处理稍有差别。2、最原始的C语言中,没有string,在C++里才有了string这个类。3、注意,string是一个类,不是类型。类这个概念是C++才特有的,它的存在是为了模块化编程。类是一个相对复杂的东西,它就象一个单元,包含了自已内部的数据定义、函数等等。二、值得...

...一个vector对象,其每个元素都是指向string类型的指针,读取该vector...
vector<string*> sp;string str;vector定义sp时用的是string* ;而你要存储的数据为 string类型 ;类型不匹配 (将vector<string*> sp改为vector<string> sp)在C++中,std::string 一般使用 string 形式,而不使用string * ;

请问C++ 如何从txt文件中读取数据,然后保存在类的数组中?
要声明一个信息(学生)类的数组然后再读文件,读文件大概代码如下:ifstream File_read;while(!File_read.eof()){ File_read>>data[i].num>>data[i].name>>data[i].score;i++;} 数组data是的类型是信息类。自己试试。

C++ 在源文件中添加类,然后在“类.h”里声明string类型会是“未...
不用那样,“类.h”是C语言字符串处理用的头文件,C++包含#include <iostream>,再写using namespace std;就可以了,要用流输入输出字符串的话再包含一个"string",而不是"string.h"就行!

c++ 类A中含有一个string类型的私有数据成员 需要通过构造函数将它初 ...
\/\/ C++11#include <iostream>#include <vector>#include <string>using namespace std;class A{string s;public:A(string t): s(t){}void display(){cout << s << endl;}};class B{vector<A> vA;public:B(const vector<string> &vs){for each(string s in vs)vA.push_back(A(s)...

C++中string怎么用?麻烦大神给个详细的解答!
1.声明一个C++字符串声明一个字符串变量很简单: string Str;这样我们就声明了一个字符串变量,但既然是一个类,就有构造函数和析构函数。上面的声明没有传入参数,所以就直接使用了string的默认的构造函数,这个函数所作的就是把Str初始化为一个空字符串。String类的构造函数和析构函数如下:a) string s; \/\/生成...

C++怎么从文件连续读int string int char类型的数据
方法1 字符串指针保存:fopen() 打开读文件,然后用fgets()逐行读,再用strtok()按空格分割或者写个子函数进行分割。方法2 String类保存:string类的内置方法不太清楚。。。可以说下思路,将数据保存在String类中(直接在String类中还是用字符传构造?用字符串构造的话其实可以直接参考方法1),可以用find...

相似回答